2

私はCで書かれたプログラムを持っていて、それはBerkeley-Db、glib-2、およびlibxml-2を使用しています。これは、構文分析と意味分析を使用してNLPを作成し、単語ではなく検索インデックスに概念構造を格納する検索インデクサーです。

ただし、問題があります。1日ほど経つと、プログラムのメモリが不足します。

valgrindでプログラムを実行しようとすると、動作が非常に遅くなり、通常の実行よりも10倍遅くなるように見えます。

メモリリークをチェックするためのすべての試み(valgrindの下で数週間行われた)は、リークを示しませんでした。

この状況で私を助けることができるいくつかのツールを誰かが知っていますか?

4

1 に答える 1

2

私の解決策は次のようになります:

#define malloc(size) mymalloc(size, __FILE__, __FUNCTION__, __LINE__)
... (realloc, calloc, free)

void *mymalloc(size_t size, char *file, char *function, int line)
{
  void *data = malloc(size);
  addList(data, size, file, function, line);
  return data;
}

void myfree(void *data)
{
  removeList(data);
  free(data);
}

void debugalloc()
{
  printList();
}

removeList()は、グローバルリストで「データ」を検索して削除するか、警告を表示します。「debugalloc();」を使用 リスト全体を印刷する必要があります(通常、リストは空であるか、期待するもので十分に満たされている必要があります)。

別のオプション:メモリ管理が断片化されます...(upps、Alexey Frunzeはほんの少し前にコメントセクションでそれを書きました。)

エディス:XML

私はDOMとSAXについてコメントしましたが、このコメントを拡張するだけの感覚があります。

<head><data>...</data><data>...</data>......<data>...</data></head>

SAXの優れた候補です。DOMでは、XML全体が読み取られてメモリに変換されます。これにより、<data>自体が異なるサイズの値で構造化されている場合、メモリが断片化する可能性があります。オペレーティングシステムのメモリモデルが、少量のメモリの悪用に対して機能する場合があります。

SAXを使用すると、データの一部のみをメモリにロードし、消費されるとすぐにデータを削除します。ただし、実装は、ドキュメントのトラバースから、フィード(<data>)および消費/処理(</ data>)を使用する一種のステートマシンに変更する必要があります。

于 2012-10-01T12:39:33.307 に答える