〜50MBのXMLファイルを解析し、元のXMLファイルへのリンクなしでデータを内部オブジェクト構造に抽出するプログラムがあります。必要なメモリ量を大まかに見積もろうとすると、40MB と計算されます。
しかし、私のプログラムには 350MB 程度が必要で、何が起こるかを調べようとします。私は を使用boost::shared_ptr
しているので、生のポインタを扱っていないので、メモリ リークが発生していないことを願っています。
私は自分がしたことを書こうとしていますが、誰かが私のプロセスの問題や間違った仮定などを指摘してくれることを願っています.
まず、どのように測定したのですか?以前htop
は、メモリがいっぱいで、コードを使用するプロセスがそのほとんどを使用していることに気付きました。さまざまなスレッドのメモリを合計し、よりきれいな出力を得るために、http://www.pixelbeat.org/scripts/ps_mem.pyを使用しました。
理論上の消費量を大まかに見積もって、消費量と少なくともそれがどうあるべきかの間にどの要因があるかを把握しました。10 です。そこでvalgrind --tool=massif
メモリ消費量を分析していました。これは、350MB のピーク時に 250MB がライブラリxml_allocator
に由来するものによって使用されていることを示していpugixml
ます。コードのセクションに移動し、 をインスタンス化し、オブジェクトのデストラクタにpugi::xml_document
を入れてstd::cout
、プログラムのかなり早い段階でオブジェクトが解放されたことを確認しました (最後に、メモリ消費を測定するのに十分な時間を確保するために 20 秒間スリープします)。 、デストラクタからのコンソール出力が表示された後でも 350MB のままです)。
今、私はそれを解釈する方法がわかりません.誰かが私が間違った仮定をしたり、そのようなことをしたりするのを助けてくれることを願っています.
を使用する最も外側のコード スニペットpugixml
は次のようになります。
void parse( std::string filename, my_data_structure& struc )
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(filename.c_str());
for (pugi::xml_node node = doc.child("foo").child("bar"); node; node = node.next_sibling("bar"))
{
struc.hams.push_back( node.attribute("ham").value() );
}
}
そして、私のコードではpugixml
要素をどこかに保存していないので (実際の値のみが引き出されます)、doc
関数が終了したときにすべてのリソースを解放することを期待しますparse
が、グラフを見ると、(時間軸上で) どこにあるのかわかりません。 ) これが起こります。