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

在Ruby中处理大量文件时速度减慢,ruby,macos,performance,Ruby,Macos,Performance,我正在尝试创建一个包含大约64000个对象的大型数组。对象被截断为256个文件摘要 这些文件位于256个子目录(名为00-ff)中,每个子目录包含大约256个文件(每个子目录略有不同)。每个文件大小大约在1.5KB到2KB之间 代码如下所示: require 'digest' require 'cfpropertylist' A = Array.new Dir.glob('files/**') do |dir| puts "Processing dir #{dir}" Dir

我正在尝试创建一个包含大约64000个对象的大型数组。对象被截断为256个文件摘要

这些文件位于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)
如果我处理16个目录(将上面的“files/**”替换为“files/0*”),则在我的机器上花费的时间是0.340秒

但是如果我尝试处理所有目录,在处理了大约34个目录之后,处理速度会大大降低

这是在最新的OSX上,使用的是股票ruby。 这台机器是2011年年中的iMac,具有12GB内存和3.4GHz Intel Core i7

限制因素似乎不是数组大小:因为如果我删除sha256处理,而只存储文件名,那么速度就不会减慢


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

这是一个磁盘/FS缓存问题。在运行完脚本并再次运行之后,减速基本上消失了。另外,使用另一台装有SSD的计算机也没有显示出速度减慢。

“我可以做得更好吗,或者跟踪问题”是。用ruby-prof.meh分析一下,我发现这只是磁盘缓存。我必须在调试脚本时多次运行该脚本,以便在磁盘缓存中快速读取正在处理的第一个文件。在让脚本越来越长之后,速度会越来越慢。而且,那台机器有一个旋转圆盘。我在一台功能不太强大的带有SSD的mac电脑上试过,即使在第一次运行时也没有注意到速度减慢。