250 MBのテキストファイルを1行にまとめています。
このファイルで、a
文字をb
文字に置き換えます。
sed -e "s/a/b/g" < one-line-250-mb.txt
それは失敗します:
sed: couldn't re-allocate memory
この種のタスクは、多くのメモリを割り当てずにインラインで実行できるように思えます。
仕事に適したツール、またはsed
を使用するためのより良い方法はありますか?
GNU sedバージョン4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
はい、代わりにtr
を使用してください:
tr 'a' 'b' < file.txt > output.txt
sed
はラインで取引するため、巨大なラインは問題を引き起こします。行を保持するために内部的に変数を宣言していて、入力がその変数に割り当てられた最大サイズを超えていると思います。
一方、tr
は文字を扱い、任意の長い行を正しく処理できるはずです。
Sedとawkの過去のバージョンにはメモリの問題がありましたが、これらは主に最近のバージョンで修正されていますが、この問題の古典的な発生の1つは Larry Wall かなり困難でした。彼の答えは、新しいプログラミング言語を書くことでした-ハードウェア以外のメモリ制限はありません。彼はそれをPerlと呼んだ。特定の問題はより簡単に解決できますが、私が使用する一般的な経験則は、sedがPerlを使用しない場合です。
編集:例をリクエストして:
Perl -pe "s/a/b/g" < one-line-250-mb.txt
またはより少ないメモリ使用量の場合:
Perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt