我很惊讶,这会引发内存不足错误,因为操作是在scala.collection.Iterator的顶部。各条线的尺寸小(< 1KB)令人惊讶的Scala迭代器“内存不足”错误
Source.fromFile("largefile.txt").getLines.map(_.size).max
似乎它试图加载整个文件在存储器中。不知道哪一步触发了这一点。对于这样的基本操作来说,这是令人失望的行为。有没有简单的方法呢。这是由图书馆实施者设计的原因吗?
在Java8中尝试相同。
Files.lines(Paths.get("largefile.txt")).map(it -> it.length()).max(Integer::max).get
//result: 3131
而且这个工作可以预测。 Files.lines返回java.util.stream.Stream并且堆不会爆炸。
更新:看起来像归结为新的线解释。两个文件都被解释为UTF-8,并且它们都调用java.io.BufferedReader.readLine()。所以,仍然需要找出差异在哪里。我将两个片段主要类编译到同一个项目jar中。
很多...文件大小比堆大小大。那不是重点。我认为这不重要,因为它是一个迭代器。 – smartnut007 2015-03-03 02:29:59
重现这个文件有多大?我只是在10 GB上运行,没有任何问题。 – 2015-03-03 03:43:14
你确定*每行少于1KB?如果没有任何换行符,那么调用'_.size'将会生成一个非常大的'String'并且很快耗尽内存。 – 2015-03-03 03:53:10