Scala 斯卡拉圆滑的懒虫

Scala 斯卡拉圆滑的懒虫,scala,slick,Scala,Slick,我希望能够使用Slick从一个非常大的表中获取所有记录。 如果我试图通过foreach、for或列表获取来实现这一点;我得到一个内存不足的异常 是否有任何方法可以使用“游标”进行灵活或延迟加载,只在需要时获取对象,从而减少所使用的内存量 不确定游标是什么意思,但可以使用分页获取部分数据: query.drop(0).take(1000) will take the first 1000 records query.drop(1000).take(1000) will take from 100

我希望能够使用Slick从一个非常大的表中获取所有记录。 如果我试图通过foreach、for或列表获取来实现这一点;我得到一个内存不足的异常


是否有任何方法可以使用“游标”进行灵活或延迟加载,只在需要时获取对象,从而减少所使用的内存量

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

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.

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

您可以使用
迭代器的组合,它返回一个迭代器:

 val object = Objects.where(...).map(w => w).iterator()
还有一个团员:

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

正如本

指令所建议的那样,米吉尼的回答是正确的。几天前,由于对Query.list()的错误假设,我遇到了类似的问题,因此我可以提供更多的上下文。从Slick参考:

“查询是使用调用程序trait(或无参数版本的UnitInvoker)中定义的方法执行的。”。有一个来自查询的隐式转换,因此您可以直接执行任何查询。最常见的使用场景是使用特殊方法(如list)将完整的结果集读取到严格的集合中,或者使用可以构建任何类型集合的泛型方法”


确实,Query.list()会将完整的结果集加载到内存中。记住这一点,你可以有多种方法来解决你的问题。

是的,我想,问题是我想要一个
fetchNext
这样的东西,只是为了抓取结果集中的下一条记录。似乎是
foreach
将所有结果提取到一个列表中(进程内存不足)。也许我可以使用分页技术实现自己的函数来获取部分结果集。谢谢为什么不使用slick?@matt过去的某个时候,positionedresult迭代器导致outofmemory错误,但我认为这个问题已经解决了。迭代器也有take和drop方法,但我认为您的意思是使用next和hasnext方法,对吗?不确定为什么foreach会导致OOM,它一次只能处理一个元素。您可以改为尝试elements(),它将返回CloseableIterator。如果这也会导致OOM,请发布其余代码。您缺少val对象定义末尾的s