有没有更快的方法来迭代Grails中的MongoResultList?

时间:2015-11-10 17:36:36

标签: mongodb grails gorm

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

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

查询非常快,返回大约9000行。问题是当我尝试迭代列表时:

entites.each {
    // Do something in here
}

迭代列表(循环内没有任何内容)将花费9秒钟。

根据我的发现,这是由于GORM将MongoResultList中的每个元素转换为Entity对象(来自DBObjects)。

还有其他方法可以迭代这个列表吗?在de / serialization过程中是否有一些我可以改变以提高性能的东西?

更新:

以下是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()方法调用。原因是反序列化,但它们是更好的选择吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

上面显示的条件查询将返回List,如下所示:

[
    [1, 2, 3],
    [4, 5, 6]
]

如果您需要有关投影的更多信息,我可以获得article