Scala Slick Lazy Fetch

时间:2013-01-16 23:39:53

标签: scala slick

我希望能够使用Slick从一个非常大的表中获取所有记录。 如果我试图通过foreach,for或list fetching来做到这一点;我得到了一个Out of Memory Exception。

有没有办法使用Slick或延迟加载的“游标”,只在需要时获取对象减少使用的内存量?

3 个答案:

答案 0 :(得分:5)

不确定游标是什么意思,但你可以使用分页来获取部分数据:

query.drop(0).take(1000) will take the first 1000 records

query.drop(1000).take(1000) will take from 1001 to 2000 lines of the table.

但是这个查询效率将取决于你的数据库,如果它支持它,如果表是正确的索引。

答案 1 :(得分:1)

你可以使用返回迭代器的iterator的组合:

 val object = Objects.where(...).map(w => w).iterator()

和groupby:

val chunkSize = 1000
val groupedObjects = objects.grouped(chunkSize)
groupedObjects.foreach {objects => objects.par.map(h => doJob(h))}

作为此answer

中的建议

答案 2 :(得分:0)

dirceusemighini的回答是正确的。由于对Query.list()的错误假设,几天前我遇到了类似的问题,所以我可以提供更多的上下文。来自Slick参考:

“使用Invoker trait(或无参数版本的UnitInvoker)中定义的方法执行查询。有一个Query的隐式转换,因此您可以直接执行任何查询。最常见的使用场景是读取完整的结果集使用专门的方法(例如list或可以构建任何类型的集合的通用方法)进入严格的集合“

Query.list()确实在内存中加载了完整的结果集。考虑到这一点,您可以针对您的问题采用多种方法。