gpt4 book ai didi

mongodb - 有没有更快的方法来遍历Grails中的MongoResultList?

转载 作者:行者123 更新时间:2023-12-02 15:56:05 31 4
gpt4 key购买 nike

我正在使用Grails 2.4.4,并使用以下命令从数据库中查询实体列表:

List<Entity> entities = Entity.findAllByCode("code");

该查询非常快,并且返回大约9000行。问题是当我尝试遍历列表时:
entites.each {
// Do something in here
}

遍历列表(循环中没有任何内容)将花费9秒钟以上的时间。

从我发现的结果来看,这是由于GORM将MongoResultList中的每个元素都转换为一个Entity对象(来自DBObjects)。

我还有另一种方法可以遍历此列表吗?在反序列化过程中是否缺少我可以更改以提高性能的内容?

更新:

这是MongoResultList类的相关部分,它是主要瓶颈。每当我遍历列表时都会调用此方法。第二次,迭代速度提高了几个数量级。
    @SuppressWarnings("unchecked")
@Override
public Object get(int index) {
if(initializedObjects.size() > index) {
return initializedObjects.get(index);
}
else if(!initialized) {
while(cursor.hasNext()) {
if(internalIndex > index) throw new ArrayIndexOutOfBoundsException("Cannot retrieve element at index " + index + " for cursor size " + size());
Object o = convertDBObject(cursor.next());
initializedObjects.add(internalIndex,o);
if(index == internalIndex++) {
return o;
}
}
initialized = true;
}
throw new ArrayIndexOutOfBoundsException("Cannot retrieve element at index " + index + " for cursor size " + size());
}

这是 convertDBObject()方法调用所花费的时间。原因是反序列化,但是还有其他更好的选择吗?

最佳答案

如果创建Entity实例是瓶颈,则可以尝试仅检索所需的属性:

def rows = Entity.withCriteria {
eq('code', code)

projections {
property('a')
property('b')
property('c')
}
}

上面显示的条件查询将返回 List,如下所示:
[
[1, 2, 3],
[4, 5, 6]
]

如果您需要有关投影的更多信息,请为此提供 article

关于mongodb - 有没有更快的方法来遍历Grails中的MongoResultList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33636121/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com