如何逐行读取大文本文件并将此流逐行附加到 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
是一个严格的内存数据结构。
假设我想将几个大文件合并为一个文件,然后 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
是一个严格的内存数据结构。