2016-07-01 23 views
2

Ich verwende den folgenden Code, um eine sehr große Datei (ca. 16 GB) in Lua zu laden und Probleme mit dem Arbeitsspeicher zu bekommen. Ich frage mich, ob der folgende Code, lädt die ganze Datei im Speicher und dann Zeile für Zeile oder nur eine Zeile wird nacheinander geladen?Lädt Lua beim zeilenweisen Lesen die gesamte Datei in den Speicher?

for line in f:lines() do ... end 

Gibt es bessere Möglichkeiten, große Dateien in Lua zu laden?

+0

Was Sie haben, sieht gut aus. Vielleicht, wenn Sie uns den vollständigen Code zeigen, können wir Ihnen helfen, denn der Fehler ist nicht in dem, was Sie gezeigt haben. Sie haben uns auch nicht die vollständige Fehlermeldung angezeigt. –

+0

Nein. In diesem Fall speichert Lua keine ganze Datei. Aber möglicherweise ist Ihr Ruhecode verhindern, dass gc Speicher freigibt. – moteus

+0

Iterator 'file: lines()' lädt nicht die gesamte Datei gleichzeitig. –

Antwort

0

Nein und ja.

Ihr Konstrukt liest in der Tat Zeilen nacheinander, und sie gehen außerhalb des Geltungsbereichs sofort nach end von for Block. Zu diesem Zeitpunkt gibt Lua jedoch keinen Systemspeicher frei, tut dies aber entweder periodisch in kleinen Speicherbereinigungsschritten oder in einem großen Durchlauf bei Bedarf. Lua wird nicht aggressiv seinen internen Speicher aufräumen, wenn er Speicher hat.

Sie müssen entweder die GC-Konfigurations-/Speicherbegrenzungen entsprechend einrichten, um Lua aggressiver zu machen, oder manuell einmal pro vernünftige Anzahl von Zeilen collectgarbage aufrufen.

+1

Jedes Out-of-Memory-Ereignis verursacht das Sammeln des Abfalls. Wenn Lua mit OOM-Fehler abgestürzt ist, bedeutet dies, dass kein Müll zu sammeln ist, der gesamte Speicher ist mit Daten gefüllt, auf die der Benutzer verweist. –