如何在Ruby中逐行读取大型文本文件并将此流逐行追加到文件中?

4

假设我想把几个大文件合并成一个,然后再对它进行uniq!操作(仅此操作可能需要一点时间)

据我了解,File.readlines()会将所有行加载到内存中。 是否有一种逐行读取的方法,就像node.js pipe()系统一样?


你确定要逐行执行它(而不是一次执行1Mb)吗? - Frederick Cheung
4个回答

6
Ruby 的一个伟大之处在于你可以使用块进行文件 IO 操作:
File.open("test.txt", "r").each_line do |row|
  puts row
end               # file closed here

所以事情会自动清理。也许在一个小脚本上并不重要,但知道你可以免费获得它总是很好的。


3

如果您使用readline,就不需要一次性处理整个文件内容,也不需要存储每行的全部内容。

file = File.open("sample.txt", 'r')
while !file.eof?
   line = file.readline
   puts line
end

如果是这样,那为什么使用“readlines”加载一个350Mb的文件需要大约5秒的时间呢?我只是认为它在“预加载”数组。 - dsp_099
是的,我也遇到了同样的问题,但 readline 函数节省了很多我的时间。如果这个方法有效,请接受答案。 - Muaaz Rafi

1
大文件最好使用流式方法进行阅读,例如其他答案中展示的each_line或者使用foreach打开文件并逐行读取。因此,如果进程不要求在内存中拥有整个文件,则应该使用流式方法。在使用流式方法时,即使文件大小增加,所需的内存也不会增加,与非流式方法如readlines相反。

File.foreach("name.txt") { |line| puts line }


1

uniq!定义在Array上,因此您仍需要将文件读入Array中。您不能逐行处理文件,因为您不想处理文件,而是想处理一个Array,而Array是一种严格的内存数据结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接