我有一个外部程序可以生成我需要的一些数据。通常,我将其输出重定向到一个文件,然后从我的Scala应用程序中读取它,例如
app.exe> output.data
现在,我想整合这个过程,所以我做了
val stream = "app.exe" lineStream
stream foreach { line => doWork(_) }
不幸的是,一段时间后我得到了 GC开销异常。此app.exe
可能会生成非常大的输出文件,例如超过100MB。所以我认为在流式传输过程中,Scala一直在创建/销毁line
字符串实例数千次,并导致开销。
我知道我可以调整JVM变量以增加GC开销限制。但我正在寻找一种不需要创建大量小line
实例的方法。
答案 0 :(得分:3)
问题可能是由于记忆,这是以这种方式对流进行预告的副作用。实际上,您将整个文件存储在内存中。
在此处查看有关如何避免此问题的大量信息:http://blog.dmitryleskov.com/programming/scala/stream-hygiene-i-avoiding-memory-leaks/
具体而言,您违反了规则#1。尝试将您的信息流定义为def
,而不是val
。