【发布时间】:2017-11-23 20:50:39
【问题描述】:
我正在使用 Scala。
我试图从一个大约有 400 万行的表中获取所有数据。我使用流,代码是这样的
val stream Stream[Record] = expression.stream().iterator().asScala.toStream
stream.map(println(_))
表达式是 Jooq 中的 SelectFinalStep[Record]。
但是,第一行太慢了。它需要几分钟。我做错了吗?
【问题讨论】:
-
流保存在内存中以便重新遍历。如果您只打算使用一次,则应该直接使用迭代器。您应该考虑使用更现代的流式处理框架,或使用 Slick 流式处理操作来使用数据库。我很确定在该表达式上调用
stream试图获取太多的数据库行,您需要一个分页系统,它可以让您“及时”获取结果集的块,而不是提前全部获取,并指定提取大小,因此您在任何给定时间只处理 10k 条记录,比方说,而不是 400 万条。 -
@flavian:当 jOOQ 可以很容易地做到这一点时,为什么还要推荐 slick?
-
我正在使用流以避免使用过多的内存。如您所说,它不会节省任何内存。 @flavian 有什么存档建议吗?