解析大文件(10 + gb)并在另一个文件中写入内容

时间:2012-08-14 09:47:16

标签: ruby file parsing io

我正在尝试使用Sphinx Search Server索引一个非常大的文件(大约14gb)。 该文件是以空格分隔的,每行一个条目。

为了能够与Sphinx一起使用,我需要向Sphinx服务器提供一个xml文件。 如何在不杀死计算机的情况下完成这项工作?

最佳策略是什么?我应该尝试将主文件拆分成几个小文件吗?最好的方法是什么?

注意:我在Ruby中这样做,但我完全接受其他提示。

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

我认为主要思想是逐行解析主文件,同时生成结果XML。每当它变得足够大,就把它喂给狮身人面像。冲洗并重复。

答案 1 :(得分:0)

您需要做什么解析?如果转换一次只限于输入中的一行并且不太复杂,我会使用awk而不是Ruby ...

答案 2 :(得分:0)

我讨厌在问题之后不写解决方案的人。所以我会试着不要成为其中之一,希望它会对某人有所帮助。

我在File类中添加了一个简单的reader方法,然后根据我选择的块大小使用它来循环文件。实际上非常简单,就像狮身人面像的魅力一样。

class File

  # New static method
  def self.seq_read(file_path,chunk_size=nil)
    open(file_path,"rb") do |f|
      f.each_chunk(chunk_size) do |chunk|
        yield chunk
      end
    end
  end

  # New instance method
  def each_chunk(chunk_size=1.kilobyte)
    yield read(chunk_size) until eof?
  end

end

然后就这样使用它:

source_path = "./my_very_big_file.txt"
CHUNK_SIZE  = 10.megabytes
File.seq_read(source_path, CHUNK_SIZE) do |chunk|
  chunk.each_line do |line|
    ...
  end
end