繰り返し自由形式の文字列を「dd」と同じくらい早くファイルに書き込むにはどうすればよいですか?

繰り返し自由形式の文字列を「dd」と同じくらい早くファイルに書き込むにはどうすればよいですか?

dd繰り返し書き込むことができる\0 バイトファイルは非常に高速に書き込まれますが、繰り返しランダムな文字列を書き込むことはできません。
お持ちですか?バッシュシェル繰り返し書き込む方法ひも「dd」(含む)ほど速いですか\0

Linuxを使用しながら6ヶ月間私が遭遇したすべての提案は似ていますが、以下に示すものとprintf "%${1}s" | sed -e "s/ /${2}/g"比較すると痛みを伴うほど遅く、約384MB(私の箱から)後にクラッシュが発生します。実際、これは一行で悪くありません。長さ:) - しかし、崩れます!文字列に改行文字が含まれていると問題にならないようです。ddsed
sed

ddprintf+との速度比較sed

                            real        user        sys       
WRITE 384 MB: 'dd'          0m03.833s   0m00.004s   0m00.548s
WRITE 384 MB: 'printf+sed'  1m39.551s   1m34.754s   0m02.968s

# the two commands used   
dd if=/dev/zero bs=1024 count=$((1024*384))
printf "%$((1024*1024*384))s" |sed -e "s/ /x/g"

これを行う方法についてのアイデアがあります。バッシュシェルスクリプトを作成しますが、ホイールを再作成する必要はありません。 :)

ベストアンサー1

$ time perl -e \
    '$count=1024*1024; while ($count>0) { print "x" x 384; $count--; }' > out
real    0m1.284s
user    0m0.316s
sys 0m0.961s
$ ls -lh out
-rw-r--r-- 1 me group 384M Apr 16 19:47 out

"x" x 384(384を生成する文字列)xを必要なものに置き換えます。

各ループでより大きな文字列を使用し、通常のstdoutバッファリングをバイパスすることで、これをさらに最適化できます。

$ perl -e \
   '$count=384; while ($count>0) {
      syswrite(STDOUT, "x" x (1024*1024),  1024*1024);
      $count--;
    }' > out

この場合、syswriteコールはデフォルトのwriteシステムコールに1Mを渡すので、非常に良いです。 (これでユーザーあたり約0.940秒を得ました。)

syncヒント:前の実行のフラッシュが現在の実行のI / Oを妨げないように、各テスト間でこの呼び出しを呼び出す必要があります。

ちなみに今回は次のようになります。

$ time dd if=/dev/zero bs=1024 count=$((1024*384)) of=./out
393216+0 records in
393216+0 records out
402653184 bytes (403 MB) copied, 1.41404 s, 285 MB/s

real    0m1.480s
user    0m0.054s
sys 0m1.410s

おすすめ記事