7 votes

La façon la plus rapide d'analyser un gros fichier en Ruby

J'ai un simple fichier texte qui fait ~150mb. Mon code lira chaque ligne, et si elle correspond à certaines regex, elle sera écrite dans un fichier de sortie. Mais pour l'instant, il faut beaucoup de temps pour parcourir toutes les lignes du fichier (plusieurs minutes) en procédant comme suit

File.open(filename).each do |line|
  # do some stuff
end

Je sais que c'est le bouclage des lignes du fichier qui prend du temps car même si je ne fais rien avec les données dans "#do some stuff", cela prend toujours beaucoup de temps.

Je sais que certains programmes Unix peuvent analyser de gros fichiers comme celui-ci presque instantanément (comme grep), je me demande donc pourquoi ruby (IRM 1.9) prend autant de temps pour lire le fichier, et s'il y a un moyen de le rendre plus rapide ?

5voto

tadman Points 70178

Il n'est pas vraiment juste de comparer avec grep car il s'agit d'un utilitaire très perfectionné qui ne fait qu'analyser les données et n'en stocke aucune. Lorsque vous lisez ce fichier avec Ruby, vous allouez de la mémoire pour chaque ligne, puis vous la libérez lors du cycle de ramassage des ordures. grep est une machine à traiter les expressions rationnelles.

Il se peut que vous puissiez atteindre la vitesse souhaitée en utilisant un programme externe tel que grep appelé à l'aide de system ou par l'intermédiaire de l'installation de tuyauterie :

`grep ABC bigfile`.split(/\n/).each do |line|
  # ... (called on each matching line) ...
end

2voto

steenslag Points 29662
File.readlines.each do |line|
  #do stuff with each line
end

Lit le fichier entier dans un tableau de lignes. Cela devrait être beaucoup plus rapide, mais cela prend plus de mémoire.

-2voto

Zepplock Points 6863

Vous devez le lire dans la mémoire, puis l'analyser. Bien sûr, cela dépend de ce que vous recherchez. Ne vous attendez pas à des performances miraculeuses de la part de ruby, surtout en comparaison avec les programmes c/c++ qui sont optimisés depuis 30 ans ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X