0

db4o データベースに 15000 以上のオブジェクトがある場合に発生する OutOfMemoryError

私の質問は、私の以前の質問(上記)に関連しています。同じ PostedMessage モデルと同じクエリの場合。

100,000 個の PostedMessage オブジェクトがある場合、クエリは最初の 20 個の PostedMessages を返すのに約 1243 ミリ秒かかります。

これで、1,000,000 個の PostedMessage オブジェクトを db4o に保存しました。同じクエリに 342,132 ミリ秒かかりました。これは非線形的に高いです。

クエリ速度を最適化するにはどうすればよいですか?

FYR: timeSent と timeReceived はインデックス付きフィールドです。SNAPSHOT クエリ モードを使用しています。TA/TP を使用していません。

4

2 に答える 2

0

@Gamlorいいえ、私はまったくソートしていません。コードは次のとおりです。

public static ObjectSet<PostedMessage> getMessagesBetweenDates(
        Calendar after,
        Calendar before,
        ObjectContainer db) {

    if (after == null || before == null || db == null) {
        return null;
    }
    Query q = db.query(); //db is pre-configured to use SNAPSHOT mode.
    q.constrain(PostedMessage.class);
    Constraint from = q.descend("timeRecieved").constrain(new Long(after.getTimeInMillis())).greater().equal();
    q.descend("timeRecieved").constrain(new Long(before.getTimeInMillis())).smaller().equal().and(from);
    ObjectSet<EmailMessage> results = q.execute();
    return results;
}

このメソッドの引数は次のとおりです。

後 = 13-09-2011 10:55:55

前 = 13-09-2011 10:56:10

そして、「後」と「前」の間に返される PostedMessages は 10 個だけだと思います。(timeReceived が 1 秒ずつ増加するダミーの PostedMessage を生成しています。)

于 2012-09-13T15:31:10.380 に答える
0

結果をソートしますか?残念ながら、db4o はソート / orderBy にインデックスを使用しません。つまり、O(n*log(n)) を使用して、通常の並べ替えアルゴリズムを実行します。線形にスケーラしません。

また、db4o は TOP 演算子をサポートしていません。つまり、後でエンティティを読み取らない場合でも、並べ替えを行わなくても、id を結果セットにコピーするにはかなりの時間がかかります。

したがって、結果のサイズを削減するいくつかの基準を使用することを除いて、これには本当に良い解決策はありません。

不本意な人は別のクエリ評価を使用するかもしれませんが、個人的にはお勧めしません。

于 2012-09-13T11:50:18.190 に答える