我有一个6GB大小的文本文件。我想要做类似于以下的操作:
str.gsub!('xxx', 'x')
这个想法是使用seek读取1MB的块。有没有更有效率的方法来替换上述内容?也许可以使用类似C语言数组访问的方式来迭代字符串?
您可以使用子进程和 sed
来实现,这将非常快:
`sed -i -E 's:xxx:x:g' file_name`
File.open('new_file', 'w') do |out|
File.foreach('huge_file.txt') do |line|
out.puts line.gsub('xxx', 'x')
end
end
gsub
是最快的方法。您不能使用块读取,因为您可能会在块的末尾得到xx
,并错过了它实际上是xxx
的事实,因为下一个块以x
开头。使用sed
会更快,只要子shell的生成速度不会消耗掉这个好处。 - the Tin Man
mmap
(不幸的是这需要第三方gem)。如果你决定使用块,则需要记住你还需要处理跨越它们边界的模式,即如果前两个x
在第一个块的末尾,而第三个x
在随后块的开头。 - Greg Navis'xxxx'.sub('xxx', 'x') #=> => 'xx'
吗? - Cary Swovelandseek
会定位文件中的位置,但这并不能解决问题。文本文件是一种顺序文件,这意味着它必须按顺序读取和写入,你无法跳到一个位置并写入任意数量的字符,让文件自动扩展或收缩。操作系统、磁盘和文件并不是这样工作的。 - the Tin Man