2016-01-21 26 views
5

Yaklaşık 64000 nesne içeren geniş bir dizi oluşturmaya çalışıyorum. Nesneler, SHA256 dosyalarının özetlerini kırpmaktadır.Ruby'de çok sayıda dosya işlenirken yavaşlama

Dosyalar, her biri yaklaşık 256 dosya içeren 256 alt dizinde (00 - ff olarak adlandırılır) bulunur (her biri için biraz değişir). Her dosya boyutu 1,5 KB ve 2 KB arasındadır.

kod şuna benzer: Benim makinedir üzerinde

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) 

Ben 16 dizinleri (yukarıda 'dosya/0 *' ile 'dosyaları/**' yerine) işlerseniz, gereken süre, 0m0.340s.

Ancak hepsini işlemeye çalışırsanız, yaklaşık 34 dizin işlendikten sonra işlem hızı önemli ölçüde düşer.

Bu, en son OS X'de, stok yakutunu kullanarak bulunur. Makine, 12GB bellek ve 3.4 GHz Intel Core i7 ile 2011 ortalarında bir iMac.

Sınırlayıcı faktör, Array boyutu olarak görünmüyor: sha256 işlemini kaldırırsam ve dosya adlarını depolarsam, yavaşlama olmaz.

Daha iyi yapabileceğim veya sorunu izleyebileceğim bir şey var mı? Şu anda bir OS X veya makineye özgü bir şey olup olmadığını test etmek için başka bir işletim sistemi veya makinem yok.

+0

"Daha iyi yapabileceğim veya sorunu izleyebileceğim bir şey var mı" Evet. Ruby-prof ile paylaş. https://github.com/ruby-prof/ruby-prof –

+0

meh, bunun sadece disk önbelleği olduğunu anlıyorum. Ben hata ayıklama sırasında komut dosyasını birkaç kez çalıştırmış olmalıyım, böylece ilk dosyalar disk önbelleğinde işlenmekte ve hızlı bir şekilde okunmaktadır. Komut dosyasını daha uzun ve uzun süre bıraktıktan sonra, yavaşlama daha sonra ve sonra gerçekleşti. Ayrıca, bu makine bir dönen diske sahiptir. Bir SSD ile daha az güçlü bir mac üzerinde denedim ve ilk seferde bile yavaşlama fark etmedi. – Droopycom

cevap

0

Bu bir disk/FS önbelleğe alma sorunudur. Komut dosyasını tamamladıktan ve tekrar çalıştırdıktan sonra, yavaşlama çoğunlukla ortadan kayboldu. Ayrıca SSD ile başka bir bilgisayar kullanarak bir yavaşlama göstermedi.