2016-01-21 66 views
5

我试图创建一个包含大约64000个对象的大型数组。这些对象是截断的SHA256文件摘要。在Ruby中处理大量文件时发生速度减慢

这些文件位于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个目录(替换“文件/ **”与“文件/ 0 *”在上面),所花费的时间在我的机器是0m0.340s。

但是,如果我尝试处理所有这些文件,处理大约34个目录后处理速度大幅降低。

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

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

有什么我可以做得更好或追踪问题?我目前没有其他操作系统或机器可用来测试这是否是OS X或机器特定的事情。

+0

“有什么我可以做得更好或跟踪问题”是的。用ruby-prof进行配置。 https://github.com/ruby-prof/ruby-prof –

+0

meh,我发现它只是磁盘缓存。我必须在调试时多次运行脚本,以便在磁盘缓存中处理第一个文件并快速读取。让脚本越来越长时间后,放缓发生在晚些时候和之后。此外,该机器还有一个旋转磁盘。我在一个功能较弱的Mac上试用了它,即使在第一次运行时也没有注意到放慢速度。 – Droopycom

回答

0

这是磁盘/ FS缓存问题。在完成脚本运行后,再次运行,大部分消失。使用另一台带有SSD的计算机也没有显示出放缓。