私はArchive::Tar :: Streamedを使用して、非常に小さな小さなソースコードファイルといくつかのjarファイルを含む4GBのディレクトリをアーカイブしています。4GBのRAMを搭載したシステムを使用しており、Archive :: Tar :: Streamedを使用しています。これは、メモリ不足状態になるため、ディレクトリ全体をメモリ上に配置したくないためです。File :: Findを使用してDFS方式でディレクトリからファイルを1つずつ読み取り、Archive :: Tar::Streamedのaddメソッドを使用してtarファイルに書き込みます。任意の時点で、メモリに存在するファイルは1つだけですが、それでも、perlプロセスの%MEMは徐々に増加しています。それは最大20%になりました。私のディレクトリには800MBのファイルがありません。ここで2つの質問があります1)%MEMが徐々に増加するのはなぜですか?2)なぜそれが20%まで上がったのか。Archive :: Tarがコンテンツをtarファイルに書き込んだ後、メモリを解放していないためですか?
1 に答える
2
ストリーム指向の方法でデータを処理するときに VSZ メモリ エンベロープが大きくなることは正常ではありません。
したがって、データへの相互参照が保持されている (ハッシュなど) か、循環参照が生成されている (可能性は低い) ことを強く疑っています。
どの変数 (コード内または使用しているモジュール内の変数) がメモリ エンベロープを拡大するか、相互参照を維持するかを追跡するためのヒントについては、この投稿「私の perl プログラムでメモリ リークを見つけるためのツールはありますか」を参照してください。
于 2009-03-20T18:43:45.800 に答える