スキップしてメイン コンテンツに移動

Ruby IOパイプで高速

Ruby IOパイプで高速

Ruby実践でIO操作を理解する

Rubyでファイルや標準入出力を扱う際、IOクラスは中心的な役割を担います。IO.openでファイルを開き、readwriteでデータをやり取りします。IO操作はバッファリングを自動で行うため、メモリ効率を意識しつつ高速に処理できます。Ruby実践では、IO操作の基本を押さえた上で、より高度なテクニックへと進むことが重要です。

IO.readlinesとforeachの使い分け

ファイルを一括で読み込む場合はIO.readlinesが便利です。全行を配列として取得でき、即座にforeachでループできます。例えば:

lines = IO.readlines('sample.txt')
lines.foreach do |line|
  puts line.chomp
end

しかし、ファイルサイズが大きい場合はメモリ消費が増えるため、foreachを直接IO.foreachで逐次読み込みする方が安全です。IO.foreach('sample.txt') { |line| puts line.chomp }と書くと、1行ずつ処理されます。

逐次読み込みとバッファの最適化

逐次読み込みは、ファイルを1行ずつ読み込むことでメモリフットプリントを抑えます。RubyのIOは内部でバッファを持ち、デフォルトでは4KBのバッファサイズで動作します。バッファサイズを調整することで、I/O待ち時間を減らし、パフォーマンスを向上させることができます。例:

File.open('large.txt', 'r', &:readlines) do |file|
  file.each_line do |line|
    # 処理
  end
end

また、IO.binreadIO.readpartialを使うと、バイナリデータや部分的な読み込みが可能です。バッファリングを意識した設計は、Ruby実践において重要なスキルです。

標準入出力とパイプでデータフローを制御

RubyではSTDINSTDOUTを使って標準入出力を操作できます。パイプ(|)を利用すると、複数のRubyスクリプトやシェルコマンドを連結してデータフローを構築できます。例えば:

ruby script1.rb | ruby script2.rb > output.txt

この構文では、script1.rbの出力がscript2.rbの入力となり、最終的にoutput.txtに書き込まれます。STDIN.each_lineで逐次読み込みし、STDOUT.writeで書き出すことで、メモリをほとんど使わずに大規模データを処理できます。パイプはデータフローを直感的に表現できるため、Ruby実践で頻繁に利用されます。

この記事はAIによって作成されました。

コメント