比方说,我想几个巨大的文件合并成一个,然后uniq!
一(单独可能需要热的第二)如何逐行读取大型文本文件并将此流添加到Ruby中的逐行文件中?
这是我的理解是File.readlines()
负载的所有行到内存中。有没有办法一行一行地读取它,有点像node.js pipe()
系统如何工作?
比方说,我想几个巨大的文件合并成一个,然后uniq!
一(单独可能需要热的第二)如何逐行读取大型文本文件并将此流添加到Ruby中的逐行文件中?
这是我的理解是File.readlines()
负载的所有行到内存中。有没有办法一行一行地读取它,有点像node.js pipe()
系统如何工作?
一个关于Ruby的伟大的事情是,你可以在一个块做文件IO:
File.open("test.txt", "r").each_line do |row|
puts row
end # file closed here
这样的事情得到自动清理。也许这对小脚本无所谓,但总是很高兴知道你可以免费获得它。
您不是一次操作整个文件内容,并且如果使用readline,则不需要存储每行的全部内容。
file = File.open("sample.txt", 'r')
while !file.eof?
line = file.readline
puts line
end
如果是这种情况,为什么加载一个带有“readlines”的350Mb文件需要5秒?我只是假设它是“预加载”数组 –
是的,所以我有同样的问题,但readline节省了我很多时间。如果这有效,请接受答案。 –
最好通过流式传输方法(如each_line
)读取大文件,如其他答案或foreach
所示,后者打开文件并逐行读取。因此,如果进程没有请求将整个文件存储在内存中,则应使用流式传输方法。在使用流媒体时,即使文件大小与readlines
等非流式传输方法相反,所需内存也不会增加。
File.foreach("name.txt") { |line| puts line }
你一定要一行一行吗(而不是一次说1Mb)? –