2

私は約 4 MB の txt ファイルを 1 つだけ使用しています。このファイルは、新しい行を追加する/特定のフレーズを含む特定の行を検索する/特定の行を別の行に置き換えるなど、頻繁に I/O を必要とします。

ファイルを「同時に」処理するために、threading.RLock()稼働中のリソースをロックするために使用されます。大きなファイルではないので、単純readlines()にすべてをリストに読み込んで検索ジョブを実行read()し、ファイル全体を文字列に読み込んで、特定のフレーズを必要なものに置き換えるためにFileContent使用します。FileContent.replace("demo", "test")

しかし、問題は、私がときどき「MemoryError」に直面することです。つまり、3 日または 4 日おきに、または 1 週間ほどかかることもあります。コードを注意深くチェックしたところ、各スレッドの終了時に閉じられていないファイル オブジェクトはありません。ファイル操作に関しては、次を使用するだけです。

CurrentFile = open("TestFile.txt", "r")
FileContent = CurrentFile.read()
CurrentFile.close()

おそらくPythonは役に立たない変数を思ったほど早く削除せず、最終的にメモリ不足になると思うのでwith、ガベージコレクションが速いかもしれないステートメントを使用することを検討しています。私はそのような声明を経験していませんが、これが役立つかどうかは誰にも分かりますか? または、私の問題に対するより良い解決策はありますか?

どうもありがとう。

追加: 私のスクリプトは短時間で多くの置換を行うため、FileContent = CurrentFile.read() を使用する数百のスレッドが、FileContent をすぐに削除しないとメモリ不足になるのではないでしょうか? このような問題をデバッグするにはどうすればよいですか?

4

2 に答える 2

1

コードをもっと見ることなくして、なぜメモリが不足しているのかを知ることは不可能です。このwithステートメントは、ファイルを開いて完了したら閉じるための推奨される方法です。

with open("TestFile.txt", "r") as current_file:
    file_content = current_file.read()

(申し訳ありませんが、変数のUpperCamelCaseは私には正しく見えません...)

率直に言って、質問に示されているように実際にファイルを閉じている場合、これで問題が解決するかどうかは疑問ですが、それでも良い習慣です。

于 2011-07-18T14:07:12.517 に答える
0

メモリリークしているようです。Python は、MemoryError を返す前に利用可能なすべてのシステム メモリを使用するため、4 MB はあまり聞こえません。メモリをリークする場所は、質問で指定しなかったコードによって異なります。

OSのタスクマネージャでメモリ使用量を見ましたか?

Python のメモリ使用量をデバッグするためのツールを次に示します (Python のデバッグ コンパイルが必要です)。

http://guppy-pe.sourceforge.net/#Heapy

これを使用して、コードのメモリ使用量を分析し、作成中のオブジェクトのうち解放されていないものを確認します。

于 2011-07-18T14:56:08.267 に答える