dd
繰り返し書き込むことができる\0
バイトファイルは非常に高速に書き込まれますが、繰り返しランダムな文字列を書き込むことはできません。
お持ちですか?バッシュシェル繰り返し書き込む方法ひも「dd」(含む)ほど速いですか\0
?
Linuxを使用しながら6ヶ月間私が遭遇したすべての提案は似ていますが、以下に示すものとprintf "%${1}s" | sed -e "s/ /${2}/g"
比較すると痛みを伴うほど遅く、約384MB(私の箱から)後にクラッシュが発生します。実際、これは一行で悪くありません。長さ:) - しかし、崩れます!文字列に改行文字が含まれていると問題にならないようです。dd
sed
sed
dd
printf
+との速度比較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