2010-12-14 14 views

Répondre

4

J'ai fait quelques tests il y a quelques temps pour voir ce qui serait un bon moyen de charger un fichier texte. Le plus rapide était de lire des blocs de texte, puis de les parcourir en utilisant String.lines.

lecture d'un fichier texte qui est 188,593,869 octets comme référence:

IO.foreach(ARGV.shift) do |li| 
    print li 
end 

time ruby test.rb root.mbox > /dev/null 
# 
# real 0m3.949s 
# user 0m3.709s 
# sys  0m0.182s 

Je Dump à/dev/null pour supprimer l'écran E/S du moment.

Au lieu de lire exclusivement en ligne par ligne, le charger dans une grande partie itérer puis sur les lignes:

File.read(ARGV.shift).lines do |l| 
    print l 
end 

time ruby test.rb root.mbox > /dev/null 

real 0m3.492s 
user 0m3.281s 
sys  0m0.209s 

C'est de 0,5 seconde économie. Il a également aspiré 188 Mo de données, ce qui ne va pas bien si vous avez des fichiers plus volumineux. La bonne chose est que vous pouvez lui dire de charger le fichier entier, ce que j'ai fait, en utilisant read() ou lui dire de limiter la taille de lecture.

est ici un nettoyé de sortie wc pour le fichier texte pour votre référence:

lines: 2,465,369 
words: 26,466,463 
bytes: 188,593,869 
+0

Notez que 'File.read' sous Windows est [incroyablement lent] (http://phrogz.net/slow-file-reads-on-windows-ruby-1.9). Mieux vaut 'File.open ('foo', 'rb', &: read)' forcer le mode de lecture binaire (mais vous devez gérer vous-même les paires '\ r \ n' possibles). – Phrogz