我正在尝试使用Sphinx 搜索服务器来索引一个非常大的文件(大约 14gb)。该文件以空格分隔,每行一个条目。
为了能够将它与 Sphinx 一起使用,我需要向 Sphinx 服务器提供一个 xml 文件。我怎样才能在不杀死我的电脑的情况下做到这一点?
什么是最好的策略?我应该尝试将主文件拆分为几个小文件吗?最好的方法是什么?
注意:我是用 Ruby 做的,但我完全愿意接受其他提示。
谢谢你的时间。
我正在尝试使用Sphinx 搜索服务器来索引一个非常大的文件(大约 14gb)。该文件以空格分隔,每行一个条目。
为了能够将它与 Sphinx 一起使用,我需要向 Sphinx 服务器提供一个 xml 文件。我怎样才能在不杀死我的电脑的情况下做到这一点?
什么是最好的策略?我应该尝试将主文件拆分为几个小文件吗?最好的方法是什么?
注意:我是用 Ruby 做的,但我完全愿意接受其他提示。
谢谢你的时间。
我认为主要思想是逐行解析主文件,同时生成结果 XML。每次它变得足够大时,就可以将它喂给狮身人面像。冲洗并重复。
你需要做什么解析?如果转换一次仅限于输入中的一行并且不太复杂,我会使用awk而不是 Ruby ...
我讨厌那些在提出问题后不写解决方案的人。所以我会尽量不要成为他们中的一员,希望它会对某人有所帮助。
我向 File 类添加了一个简单的读取器方法,然后使用它根据我选择的块大小循环文件。实际上很简单,就像 Sphinx 的魅力一样。
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