-Code
def read_csv(fileName)
lines = (`wc -l #{fileName}`).to_i + 1
lines_processed = 0
open(fileName) do |csv|
csv.each_line do |line|
#process
lines_processed += 1
end
end
end
rein Rubin - Langsamer
def read_csv(fileName)
lines = open("sample.csv").count
lines_processed = 0
open(fileName) do |csv|
csv.each_line do |line|
#process
lines_processed += 1
end
end
end
Benchmarks
lief ich einen neuen Maßstab ursprüngliche Methode Vergleich zur Verfügung gestellt und meine eigenen. Ich habe auch die Informationen zur Testdatei hinzugefügt.
"File Information"
Lines: 1172319
Size: 126M
"django's original method"
Time: 18.58 secs
Memory: 0.45 MB
"OneNeptune's method"
Time: 0.58 secs
Memory: 2.18 MB
"Pure Ruby method"
Time: 0.96
Memory: 2.06 MB
Erklärung
HINWEIS: habe ich ein reines Ruby-Methode, da wc
verwendet, ist eine Art Betrug, und nicht tragbar. In den meisten Fällen ist es wichtig, reine Sprachlösungen zu verwenden.
Sie können diese Methode verwenden, um eine sehr große CSV-Datei zu verarbeiten.
~ 2MB Speicher Ich denke, ist ziemlich optimal in Anbetracht der Dateigröße, es ist ein bisschen eine Zunahme der Speicherauslastung, aber die Zeitersparnis scheint ein fairer Handel zu sein, und dies wird Timeouts verhindern.
Ich habe die Methode geändert, um einen Dateinamen zu nehmen, aber das war nur, weil ich viele verschiedene CSV-Dateien getestet habe, um sicherzustellen, dass sie alle richtig funktionierten. Sie können dies entfernen, wenn Sie möchten, aber es wird wahrscheinlich hilfreich sein.
Ich habe auch das Konzept eines Offsets entfernt, da Sie ursprünglich angegeben haben, dass Sie versuchen, das Parsing selbst zu optimieren, aber das ist nicht mehr notwendig.
Auch ich verfolge, wie viele Zeilen in der Datei sind und wie viele verarbeitet wurden, seit Sie diese Informationen verwenden mussten. Beachten Sie, dass Zeilen nur auf Unix-basierten Systemen funktionieren, und es ist ein Trick, um zu vermeiden, dass die gesamte Datei in den Speicher geladen wird, sie zählt die neuen Zeilen und ich füge 1 hinzu, um die letzte Zeile zu berücksichtigen. Wenn Sie die Header nicht als Zeile zählen, können Sie die +1 entfernen und die Zeilen in "Zeilen" ändern, um genauer zu sein.
Ein anderes logistisches Problem, mit dem Sie möglicherweise konfrontiert werden, ist die Notwendigkeit, herauszufinden, wie Sie vorgehen müssen, wenn die CSV-Datei über Header verfügt.
Wie habe ich diese Upload-Funktion für meine Anwendung – django
Haben Sie in Betracht gezogen, die CVS in einem Hintergrundjob zu verarbeiten? – spickermann
Nein, weil ich die endgültige Zählung zeigen muss, wie viele Elemente auf den Benutzer hochgeladen werden, auch wenn es ein Problem mit der CSV gibt, das ich auch dem Benutzer – django