2011-07-25 2 views
2

なぜPythonのmmap()のパフォーマンスが低下するのだろうと思っていますか?私はNファイルを変更する小さなアプリケーションを持っていることを意味します。(あまりにも大きくない、1000と言う)最初の200は悪魔スピードですが、それ以降は遅くなり、遅くなります。私はしばらくの間メモリを解放する必要があるように見えますが、なぜPythonがこれを自動的に行わないのか、どのように、そして最も重要なのか分かりません。時間のあるPythonのmmap()パフォーマンス

助けが必要ですか?お使いのOSがRAM内mmap'dページをキャッシュ

def function(filename, N): 
    fd = open(filename, 'rb+') 
    size = os.path.getsize(filename) 
    mapped = mmap(fd.fileno(), size) 

    for i in range(N): 
     some_operations_on_mmaped_block() 

    mapped.close() 
+4

いくつかのコードを表示できますか? GCが機能していない理由が考えられます。 –

+0

コードが追加されました。実際にはほとんどすべてですが、ループ内でステートメントがtrueの場合はファイルに対して3つの操作を行います。 – lihidle

+0

あなたは実際にあなたのプラットフォームのために 'トップ'かタスクマネージャか何かを見ましたか? Pythonはますます多くのメモリを占有していますか? CPUは固定されていますか?それとも、あなたのハードドライブのキャッシュがいっぱいですか? – agf

答えて

6

- - 編集

それはそのようなことです。読み出しと書き込みはキャッシュからRAM速度で行われます。汚れたページは最終的にフラッシュされます。 Linuxのパフォーマンスは、ページのフラッシュを開始する必要があるまで有効です。これは、vm.dirty_ratio sysctl変数によって制御されます。ディスクに汚れたページをフラッシュすると、読み込みはビジーなIOバス/デバイスの書き込みと競合します。考慮すべきもう一つのことは、あなたのOSがすべてのファイルをキャッシュするのに十分なRAMを持っているかどうかだけです(トップ出力のバッファカウンタ)。だからあなたのプログラムが動いている間に "vmstat 1"の出力を見て、突然IOをやるまでキャッシュ/バフカウンタが上がってくるのを見ます。