Nic*_*oul 10 performance sed large-files text-processing out-of-memory
我有一个 250 MB 的文本文件,全部在一行中。
在这个文件中,我想a用b字符替换字符:
sed -e "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)
它失败了:
sed: couldn't re-allocate memory
Run Code Online (Sandbox Code Playgroud)
在我看来,这种任务可以在不分配太多内存的情况下内联执行。
是否有更好的工具,或者更好的使用方法sed?
GNU sed 版本 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
ter*_*don 10
是的,请tr改用:
tr 'a' 'b' < file.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
sed交易线路,所以一条巨大的线路会导致它的问题。我希望它在内部声明一个变量来保存该行,并且您的输入超过分配给该变量的最大大小。
tr 另一方面处理字符,应该能够正确处理任意长的行。
sed 和 awk 的历史版本有内存问题,这些问题大多在最近的版本中得到修复,但是这个问题的一个经典事件对Larry Wall 造成了很大的打击。他的答案是编写一种新的编程语言——除了硬件之外没有内存限制。他称之为 perl。您的具体问题可以更简单地解决,但我使用的一般经验法则是 sed 不使用 perl。
编辑:通过请求一个例子:
perl -pe "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)
或减少内存使用:
perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt
Run Code Online (Sandbox Code Playgroud)