我最近开始玩Scala并遇到以下问题.下面是4种不同的方法来迭代文件的行,做一些事情,并将结果写入另一个文件.其中一些方法可以像我想的那样工作(虽然使用大量内存来执行此操作)并且有些方法会使内存无处不在.
我的想法是将Scala的getLines Iterator包装为Iterable.我不在乎它是否多次读取文件 - 这就是我期望它做的.
这是我的repro代码:
class FileIterable(file: java.io.File) extends Iterable[String] {
override def iterator = io.Source.fromFile(file).getLines
}
// Iterator
// Option 1: Direct iterator - holds at 100MB
def lines = io.Source.fromFile(file).getLines
// Option 2: Get iterator via method - holds at 100MB
def lines = new FileIterable(file).iterator
// Iterable
// Option 3: TraversableOnce wrapper - holds at 2GB
def lines = io.Source.fromFile(file).getLines.toIterable
// Option 4: Iterable wrapper - leaks like a sieve
def lines = new FileIterable(file)
def …Run Code Online (Sandbox Code Playgroud)