約64000個のオブジェクトを含む大きな配列を作成しようとしています。オブジェクトは、ファイルの切り捨てられたSHA256ダイジェストです。Rubyで大量のファイルを処理するときのスローダウン
ファイルはそれぞれ256個のファイルを含む256個のサブディレクトリ(00〜ff)にあります(ファイルごとに多少異なります)。各ファイルサイズは約1.5KBから2KBです。
コードは次のようになります。
require 'digest'
require 'cfpropertylist'
A = Array.new
Dir.glob('files/**') do |dir|
puts "Processing dir #{dir}"
Dir.glob("#{dir}/*.bin") do |file|
sha256 = Digest::SHA256.file file
A.push(CFPropertyList::Blob.new(sha256.digest[0..7]))
end
end
plist = A.to_plist({:plist_format => CFPropertyList::List::FORMAT_XML, :formatted => true})
File.write('hashes.plist', plist)
私は(「ファイル/ 0 *」上記の中で「ファイル/ **」を置き換える)16のディレクトリを処理する場合、それは私のマシン上でかかる時間があります0m0.340s。
しかし、私がそれらのすべてを処理しようとすると、約34のディレクトリが処理された後に処理速度が大幅に低下します。
これは最新のOS Xで、ストックルビーを使用しています。 このマシンは、2011年半ばのiMacで、12GBのメモリと3.4 GHzのIntel Core i7が搭載されています。
制限要因はアレイサイズではないようです。sha256処理を削除し、代わりにファイル名を保存すると、速度が低下しないためです。
問題を追跡したり改善したりできることはありますか?これがOS Xかマシン固有のものかどうかをテストするために、現時点で利用可能な別のOSやマシンはありません。
「問題が見つかった場合や問題を追跡できることはありますか?」はい。それをruby-profとプロファイルする。 https://github.com/ruby-prof/ruby-prof –
meh、私はそれが単なるディスクキャッシュであると考えています。デバッグ中にスクリプトを何度も実行して、最初のファイルが処理されている場所でディスクキャッシュ内のどこにすばやく読み込む必要があります。スクリプトを長くしたり長くしたりすると、遅くなり、遅くなりました。また、そのマシンには回転ディスクがあります。私はSSDを搭載した強力ではないMacで試してみたが、最初の実行でも減速に気付かなかった。 – Droopycom