-2

我有一个大文本文件(56MB,7500000 行)。OutofMemory如果我一次读取整个文件,我会收到错误消息。我想一次阅读 20000 行,做一些事情,然后继续。如何从特定行开始读取 20000 行?

4

3 回答 3

0

IO#each_line是你的朋友。

file = File.new('filename', 'r') # or whatever
file.each_line do |line|
  # do something with a line
end

它将有效地读取行,而不是将整个文件加载到内存中。

于 2013-09-26T10:49:34.423 回答
0

也许......使用简单的unix命令。例如sed从 5000 到 10000 行

%x{sed -n 5000,10000p ./file_you_want}.each_line do |line|
  # do with lines
end
于 2013-09-26T13:13:26.100 回答
0

此代码符合您的需要,读取一系列最大行,处理它们,清除它们并循环遍历 eof。重置数组是消除 OutofMemory 情况的关键。

class ReadLoop

  lines = Array.new       # Array to hold the next series of lines
  count = 0               # Count of lines read into the current series
  max = 3                 # Maximum number of lines

  file = File.new('yourfilenamehere', 'r') # or whatever

  file.each_line do |line|
    count += 1
    lines << line
    if count == max || file.eof
      then
        puts "Next series of lines:"
        puts lines
        count = 0
        lines = Array.new
    end
  end
end

直接回答您的问题的另一个答案是使用gets (each_line) 和lineno。查询 lineno 会告诉你 get 被调用的次数。设置 lineno 手动将当前行号设置为给定值。参考在这里。您可以尝试在上面的循环中添加“puts file.lineno”,看看它是如何工作的。

于 2013-09-26T13:02:04.000 回答