2

私は kyotocabinet TreeDB (MSVC10 ビルド) を使用しようとしてきましたが、奇妙なメモリの問題に遭遇しました。基本的に、データベースの書き込みごとにメモリ使用量が増加し、データベースが閉じられるまで低下しません。

テスト コードは次のようになります。

size_t BLOCK_SIZE = 1 << 20; // use 1MB-sized records
char* test_block = new char[BLOCK_SIZE]; // allocate record data

TreeDB db;
db.open("test.db")

// add 5000 records
for (int i = 0; i < 5000; ++i)
{
    // at each call, process virtual memory usage increases by 1 MB even though i'm not allocating more memory
    // also, as expected, in x86-32 process the whole thing runs out of memory and crashes when iteration counter comes close to 2000
    db.set(&i, sizeof(i), test_block, BLOCK_SIZE);
}

db.close(); // memory usage returns to normal here
delete [] test_block;

もちろん、各レコードを追加するときにデータベースを開いたり閉じたりすることはできますが、これにより大きな遅延 (約 1 秒) が発生し、私のタスクでは受け入れられません。また、この問題は HashDB では発生しませんが、キーによるシーケンシャル アクセスが必要になる場合があり、HashDB を実際に使用することはできません。

チューニング パラメータ (tune_page_cache、tune_buckets、tune_page) を変更しようとしましたが、うまくいきませんでした。ここで私が欠けているものを誰かに教えてもらえますか? 予測できない量の 100KB ~ 10MB のサイズのレコードを保存し、32 ビット システムで実行する必要があります。

4

1 に答える 1