OutOfMemoryError caused when db4o databse has 15000+ objects
我的问题是参考我之前的问题(上文)。对于相同的PostedMessage模型和相同的查询。
使用100,000个PostedMessage对象,查询大约需要1243毫秒才能返回前20个PostedMessages。
现在,我在db4o中保存了1,000,000个PostedMessage对象。相同的查询花了342,132毫秒。这是非线性的。
如何优化查询速度?
FYR: timeSent和timeReceived是索引字段。 我正在使用SNAPSHOT查询模式。 我没有使用TA / TP。
答案 0 :(得分:0)
你对结果进行排序吗?不幸的是,db4o不使用索引进行排序/ orderBy。这意味着它将运行常规排序算法,使用O(n * log(n))。它不会scala liniearly。
db4o也不支持TOP运算符。这意味着即使没有排序,也需要花费相当多的时间将ID复制到结果集,即使之后您从未阅读过实体。
所以,除了尝试使用一些减少结果大小的标准外,没有真正好的解决方案。
有些冒犯的人可能会使用不同的query evaluation,但我个人不建议这样做。
答案 1 :(得分: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;
}
此方法的参数如下:
after = 13-09-2011 10:55:55
之前= 13-09-2011 10:56:10
我希望在“之后”和“之前”之间只返回10个PostedMessages。 (我正在生成虚拟的PostedMessage,timeReceived各增加1秒。)