在Ruby中处理大量文件时减速

Dro*_*com 5 ruby macos performance

我正在尝试创建一个包含大约64000个对象的大型数组.对象是截断的SHA256文件摘要.

这些文件位于256个子目录(名为00 - ff)中,每个子目录包含大约256个文件(每个文件略有不同).每个文件大小介于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)
Run Code Online (Sandbox Code Playgroud)

如果我处理16个目录(在上面用'files/0*'替换'files/**'),我在机器上花费的时间是0m0.340s.

但是,如果我尝试处理所有这些,处理大约34个目录后处理速度会急剧下降.

这是最新的OS X,使用股票红宝石.该机是2011年中期的iMac,配备12GB内存和3.4 GHz Intel Core i7.

限制因素似乎不是数组大小:因为如果我删除sha256处理而只是存储文件名,则没有减速.

有什么我可以做得更好或跟踪问题?我目前没有其他操作系统或机器来测试这是OS X还是机器特定的东西.

Dro*_*com 0

这是磁盘/FS 缓存问题。运行脚本完成并再次重新运行后,速度减慢大部分消失了。另外,使用另一台配备 SSD 的计算机也没有出现速度减慢的情况。