使用Scala arm从Scala中的文件中读取行的简单函数
我想编写一个Scala函数,以惰性地读取文件中的所有行(即返回一个使用Scala arm从Scala中的文件中读取行的简单函数,scala,memory,io,lazy-evaluation,Scala,Memory,Io,Lazy Evaluation,我想编写一个Scala函数,以惰性地读取文件中的所有行(即返回一个迭代器[String]),之后也会关闭文件。我知道惯用语io.Source.fromFile(“something.txt”).getLines,但是正如前面提到的,这不会在以后关闭文件。当然有一个简单的方法可以做到这一点 目前,我正在使用此功能,包括: 但据我所知,这似乎把整个文件读入了内存 我来自Python的背景,这是一个可笑的琐事: def lines(filename): with open(filename) a
迭代器[String]
),之后也会关闭文件。我知道惯用语io.Source.fromFile(“something.txt”).getLines
,但是正如前面提到的,这不会在以后关闭文件。当然有一个简单的方法可以做到这一点
目前,我正在使用此功能,包括:
但据我所知,这似乎把整个文件读入了内存
我来自Python的背景,这是一个可笑的琐事:
def lines(filename):
with open(filename) as f:
for line in f:
yield line
当然,有一个相当简单的Scala等价物,我只是还没有找到。为什么您认为它会将整个文件读入内存
getLines
返回一个迭代器[String]
是的,getLines
是懒惰的,就像我想要的,但是当调用scala arm时,scala arm
正在将所有内容读入内存——当我运行println(lines(“BIGFILE.txt”).slice(1,10).toList)时,
我得到一个OutOfMemoryError
,而println(Source.fromFile(“BIGFILE.txt”).getLines.slice(1,10).toList)
运行时没有出现问题(尽管之后似乎没有关闭文件)。您解决了问题吗?
def lines(filename):
with open(filename) as f:
for line in f:
yield line