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

时间:2016-08-19 05:13:31

标签: ruby performance file memory filesystems

让我们说我想将几个大型文件合并为一个,然后uniq!合并一个(仅此一个可能需要一秒钟)

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

4 个答案:

答案 0 :(得分:3)

您不能同时对整个文件内容进行操作,如果您使用readline,则不需要存储每行的全部内容。

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

答案 1 :(得分:2)

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

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

所以事情会自动清理。也许这对于一个小小的剧本无关紧要,但知道你可以免费获得它总是很好。

答案 2 :(得分:1)

uniq!上定义了

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

答案 3 :(得分:0)

大文件最好通过each_line等流媒体方法读取,如另一个答案中所示,或foreach打开文件并逐行读取。因此,如果进程没有请求将整个文件放在内存中,则应使用流方法。使用流式传输时,即使文件大小与readlines等非流式传输方法相反,所需内存也不会增加。

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