【发布时间】:2012-04-06 23:29:56
【问题描述】:
我编写了一个 Scala (2.9.1-1) 应用程序,它需要处理来自数据库查询的数百万行。我正在使用我的previous questions 之一的答案中显示的技术将ResultSet 转换为Stream:
class Record(...)
val resultSet = statement.executeQuery(...)
new Iterator[Record] {
def hasNext = resultSet.next()
def next = new Record(resultSet.getString(1), resultSet.getInt(2), ...)
}.toStream.foreach { record => ... }
而且效果很好。
由于 foreach 闭包的主体是 CPU 密集型的,并且作为函数式编程实用性的证明,如果我在 foreach 之前添加一个 .par,则闭包将并行运行而没有其他闭包努力,除了确保闭包的主体是线程安全的(它以函数式风格编写,除了打印到线程安全日志之外没有可变数据)。
但是,我担心内存消耗。 .par 是导致整个结果集加载到 RAM 中,还是并行操作仅加载与活动线程一样多的行?我已经为 JVM 分配了 4G(64 位,-Xmx4g),但将来我会在更多行上运行它,并担心我最终会出现内存不足。
有没有更好的模式来以函数方式进行这种并行处理?我一直在向我的同事展示这个应用程序,作为函数式编程和多核机器价值的一个例子。
【问题讨论】:
-
只是好奇。您使用的是什么 DBMS,以及查询它的 Scala DB API 是什么?
-
我正在使用 Microsoft (msdn.microsoft.com/en-us/sqlserver/aa937724) 的 JDBC 驱动程序访问在 Windows Server 2008 R2 上运行的 Microsoft SQL Server 2012 数据库。
标签: scala memory-management parallel-processing