次のコードを使用して、Luaで非常に大きなファイル(約16GB)を読み込み、メモリの問題を解決しています。私は次のコード、メモリ内のファイル全体をロードし、行ごとに繰り返し、または一度に1行だけが読み込まれるのだろうかと疑問に思っていますか?Luaは行単位で読み込み中にファイル全体をメモリにロードしますか?
for line in f:lines() do ... end
大きなファイルをLuaにロードする方法はありますか?
次のコードを使用して、Luaで非常に大きなファイル(約16GB)を読み込み、メモリの問題を解決しています。私は次のコード、メモリ内のファイル全体をロードし、行ごとに繰り返し、または一度に1行だけが読み込まれるのだろうかと疑問に思っていますか?Luaは行単位で読み込み中にファイル全体をメモリにロードしますか?
for line in f:lines() do ... end
大きなファイルをLuaにロードする方法はありますか?
いいえ、はいです。
あなたの構造は実際に行を1つずつ読み込み、end
の直後に範囲外になります。for
ブロックです。しかし、Luaはその時点で実際にはシステムメモリを解放しませんが、定期的に小さなガーベジコレクションステップやオンデマンドで大きな掃引を行います。 Luaはメモリを持っているときに内部ストレージを掃除しても気にしません。
Luaをより積極的にするか、適切な線量ごとに手動でcollectgarbage
を手動で呼び出すには、GCの設定とメモリの制限を適切に設定する必要があります。
メモリ不足イベントが発生するたびに、ゴミの収集が行われます。 LuaがOOMエラーでクラッシュした場合、つまり、収集されるガベージがないことを意味します。メモリ全体がユーザーが参照するデータで埋められます。 –
あなたが持っているものは上手く見えます。たぶんあなたが私たちに助けてくれる完全なコードを表示した場合、バグはあなたが示したものではないからです。完全なエラーメッセージも表示されていません。 –
いいえ、この場合、Luaはファイル全体を保存しません。しかし、gcがメモリを解放するのを防ぐためのあなたの残りのコードかもしれません。 – moteus
イテレータ 'file:lines()'はファイル全体を一度にロードしません。 –