0

JDBM3データベースは(私の理解では)データにアクセスして書き込むときに非常に少ないメモリ使用量を約束しますが、次の問題があります。TreeMapのキーセット内で反復する場合でも、すべてのデータがメモリにロードされているようです。したがって、次のコード:

    db=DBMaker.openFile("Myfile")
        .make();   
    SortedMap<Integer, double[]> MyMap=db.getTreeMap("MyMap");
    int i=0;
    final Set<Integer> keySet = MyMap.keySet();
    for (Object key : keySet) {
        System.out.println(i++);
     }

すべての二重行列をメモリにロードし、最後にOutOfMemoryエラーを引き起こします。データ自体よりもはるかに多くのGBがロードされているように私には思えます。私がこれまでに検討したことは次のとおりです。

  • これはバグですか?または、データベースを作成/開くときに、この「機能」を無効にするいくつかのパラメーター(キャッシュ、トランザクション?)がありますか?

  • これは私が使用しているJDBM3alpha3のバグですか(alpha 4がある場合)?互換性がなく、すべてを最初から行う必要があるため、切り替える前にこれを確認する必要があります。

  • これは新しいMapDB(以前のJDBM4)で発生しますか?また、切り替える前にこれを確認する必要があります。

  • それとも、これは何らかの理由でライブラリの正常な動作ですか?

4

1 に答える 1

0

まず、OOEMの一般的な原因は書き込みです。JDMB3は、コミットされていないデータをメモリに保持します。したがって、大規模なトランザクションでは、メモリが不足します。解決策は、N個のアイテムごとにコミットすることです。または、トランザクションを無効にして(DBMakerオプション)、変更をファイルに直接書き込むこともできます。

次に、キーセットを反復処理しても、すべてのデータがメモリに読み込まれるわけではありません。もしそうなら、それはバグです。ただし、JDBM3はサポートされていないため、MapDBに移行することをお勧めします。

于 2013-02-16T17:57:14.903 に答える