如何逐行读取大文本文件并将此流逐行附加到 Ruby 中的文件?

How to read a large text file line-by-line and append this stream to a file line-by-line in Ruby?

假设我想将几个大文件合并为一个文件,然后 uniq! 一个文件(仅此一项可能需要很长时间)

据我了解,File.readlines() 会将所有行加载到内存中。有没有办法逐行阅读它,有点像 node.js pipe() 系统的工作原理?

你不会一次对整个文件内容进行操作,如果你使用 readline,你也不需要存储每一行​​的全部内容。

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

Ruby 的一大优点是您可以在块中执行文件 IO:

File.open("test.txt", "r").each_line do |row|
  puts row
end               # file closed here

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

大文件最好通过其他答案中所示的 each_line 等流式传输方法读取,或者使用 foreach 打开文件并逐行读取。因此,如果进程不请求将整个文件存储在内存中,则应使用流式处理方法。在使用流式传输时,即使文件大小增加,所需的内存也不会增加,这与 readlines.

等非流式方法相反

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

uniq! is defined on Array,因此无论如何您都必须将文件读入 Array。你不能逐行处理文件,因为你不想处理一个文件,你想处理一个Array,而Array是一个严格的内存数据结构。