我希望能够使用Slick从一个非常大的表中获取所有记录。 如果我试图通过foreach,for或list fetching来做到这一点;我得到了一个Out of Memory Exception。
有没有办法使用Slick或延迟加载的“游标”,只在需要时获取对象减少使用的内存量?
答案 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()确实在内存中加载了完整的结果集。考虑到这一点,您可以针对您的问题采用多种方法。