Wie effizient analysieren Sie große text-Dateien in Ruby

Schreibe ich ein import-script, dass eine Datei verarbeitet hat, dass potenziell Hunderte von tausenden von Linien (log-Datei). Mit einem sehr einfachen Ansatz (unten) nahmen sich genügend Zeit und Erinnerung, die ich fühlte, dass es würde mein MBP in jedem moment, so dass ich getötet der Prozess.

#...
File.open(file, 'r') do |f|
  f.each_line do |line|
    # do stuff here to line
  end
end

Diese Datei hat insbesondere 642,868 Linien:

$ wc -l nginx.log                                                                                                                                        /code/src/myimport
  642868 ../nginx.log

Kennt jemand eine effizientere (Speicher/cpu) Weg, um jede Zeile in dieser Datei?

UPDATE

Den code innerhalb der f.each_line von oben ist einfach ein passender regex-gegen die Linie. Wenn das Spiel ausfällt, ich die Zeile hinzufügen, um eine @skipped array. Wenn es geht, ich format die Spiele in einen hash (sortiert nach den "Feldern" des Spiels) und fügen es ein @results array.

# regex built in `def initialize` (not on each line iteration)
@regex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) - (.{0})- \[([^\]]+?)\] "(GET|POST|PUT|DELETE) ([^\s]+?) (HTTP\/1\.1)" (\d+) (\d+) "-" "(.*)"/

#... loop lines
match = line.match(@regex)
if match.nil?
  @skipped << line
else
  @results << convert_to_hash(match)
end

Bin ich völlig offen, da dies ein ineffizienter Prozess. Ich könnte den code innerhalb von convert_to_hash verwenden Sie eine vorausberechnete lambda anstelle von herauszufinden, die Berechnung jedes mal. Ich denke, ich nahm an, es war die Linie iteration und für sich war das problem, nicht die pro-line-code.

Die meisten Speicher effizienter Weg ist, wie Sie es tun, mit each_line. Sie konnte Lesen, Sie die Datei in Blöcke, die schneller ist, dann verwenden Sie String#lines zu greifen einzelne Leitungen mit der Wiedervereinigung teilweise geladen Linien, überquerte den block hinweg. Es wird zum waschen mit nach split aus, die Linien und wieder gebrochen diejenigen.

InformationsquelleAutor localshred | 2011-01-30

Schreibe einen Kommentar