Errno::ENOMEM: Cannot allocate memory - Katze
Ich habe einen job, läuft auf die Produktion, die Verarbeitung von xml-Dateien.
xml-Dateien zählt rund um 4k und von Größe 8 bis 9 GB alle zusammen.
Nach der Bearbeitung bekommen wir CSV-Dateien als Ausgabe. Ich habe eine Katze, wird der Befehl merge werden alle CSV-Dateien zu einer einzigen Datei, die ich immer bin:
Errno::ENOMEM: Cannot allocate memory
auf cat
("Backtick") Befehl.
Unten sind einige details:
- - System-Memory - 4 GB
- Swap - 2 GB
- Ruby : 1.9.3p286
Dateien verarbeitet werden, mit nokogiri
und saxbuilder-0.0.8
.
Hier, es ist ein block von code, das wird Prozess 4,000 XML-Dateien und die Ausgabe wird gespeichert im CSV-Format (1 pro xml -) (sorry, ich bin nicht davon ausgegangen, teilen Sie es b'coz der Unternehmenspolitik).
Unten ist der code, der die Zusammenführung der output-Dateien zu einer einzigen Datei
Dir["#{processing_directory}/*.csv"].sort_by {|file| [file.count("/"), file]}.each {|file|
`cat #{file} >> #{final_output_file}`
}
Habe ich genommen Speicherverbrauch Schnappschüsse während der Verarbeitung.Es verbraucht fast alle Teil des Speichers, aber es nicht scheitern.
Es scheitert ja immer an den cat
Befehl.
Ich denke, auf backtick es wird versucht die Gabel ein neues Verfahren, mit dem nicht genügend Speicher, damit es fehlschlägt.
Bitte lassen Sie mich wissen, Ihre Meinung und alternative.
Ich habe bearbeitet meine post, vielen Dank für Ihre Antwort
Vielleicht sind Sie sehr wenig Speicher für diese zu passieren, sind Sie sicher, Sie haben genug Speicher übrig ist ? Was ist die Ausgabe von
free -m
?Ich Stimme mit Ihnen überein, free-m zeigt kaum 150 MB frei heraus nach der Verarbeitung von rund 3.000 Dateien. Aber, es ist weiterhin die Verarbeitung aller Dateien und schlägt nur auf cat-Befehl.
Das ist normal, Sie haben genug Speicher für die Auflistung aller Dateien und laichen in einer Schale, aber die shell gespawnt wird scheitern, wenn die Katze läuft, dann Schreibe ich eine Lösung für Sie und poste Sie als Antwort
InformationsquelleAutor Atith | 2013-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
So scheint es, dass Ihr system läuft ziemlich niedrig auf Gedächtnis und laichen shell + Aufruf Katze ist zu viel für den wenigen Speicher.
Wenn Sie nichts dagegen haben, verlieren einige Geschwindigkeit, können Sie die Dateien Zusammenführen in ruby, mit einem kleinen Puffer.
Dies vermeidet laichen eine shell, und Sie können Steuern die Größe des Puffers.
Dies ist ungetestet, aber Sie bekommen die Idee :
InformationsquelleAutor Intrepidd
Wahrscheinlich sind Sie aus physikalischen Speicher, so überprüfen Sie, und überprüfen Sie Ihre swap (
free -m
). Falls Sie nicht über ein swap-space, erstellen.Ansonsten, wenn Ihr Gedächtnis ist in Ordnung, der Fehler ist wahrscheinlich verursacht durch shell-Ressourcen-limits. Sie können überprüfen Sie durch
ulimit -a
.Können Sie verändert werden, indem
ulimit
was ändern kann-shell-resource-limits (siehe:help ulimit
), z.B.Machen diese Grenze persistent, können Sie konfigurieren, indem Sie die ulimit-Einstellung-Datei, indem Sie den folgenden shell-Befehl:
Oder verwenden Sie
/etc/sysctl.conf
um die Grenze zu ändern, die Global (man sysctl.conf
), z.B.InformationsquelleAutor kenorb
Ich habe das gleiche problem, aber statt
cat
es warsendmail
(gem mail
).Ich gefunden, problem & Lösung hier durch die Installation
posix-spawn
Edelstein, z.B.und hier ist das Beispiel:
Siehe auch: Minimierung der Speichernutzung für die Erstellung von Anwendung, die Teilprozesse bei Oracle.
InformationsquelleAutor unixs