Dans Ruby, quelle est la méthode la plus efficace pour lire des fichiers texte géants? De l'ordre de 10 lignes avec 89 octets/ligne. Une méthode est-elle significativement meilleure qu'une autre?Méthode la plus efficace pour lire les entrées dans Ruby
Répondre
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
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
-vous dire à traiter ligne par ligne ou comment? – tokland
Oui, ligne par ligne – mbm