8つのコアを持つUnixシステムのディレクトリに複数のファイルをマージする必要があります。このファイルをマージする簡単な方法を探しています。 catコマンドは1つのコアのみを使用します。並列処理に複数のコアを使用する方法はありますか?
答え1
各行の追加I / O操作を並列化する効率的な方法はありません。〜しなければならない順番に書いてください。
答え2
まず、パフォーマンスのボトルネックを特定します。ディスクIOがボトルネックを引き起こす場合、マルチスレッドは役に立ちません。
非常に高速なディスクまたはSSDがある場合は、ファイルの長さを計算し、オフセットを計算し、複数のddコマンドを使用できます。
答え3
次のスクリプトはどうですか(スリープを使用してタスクを並列化する方法を示します)。
#!/bin/bash
eval exec 3\<<(echo FIRST FILE; sleep 3)
eval exec 4\<<(echo SECOND FILE; sleep 3)
cat <&3
cat <&4
入力ファイルを並列に読み込みます。これは多くの点で制限されており、出力を並列化しませんが、とにかく行うことはできません。
以下は、現在のディレクトリ内のすべてのファイルを処理するより完全な例です。
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(cat $file)
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done
パフォーマンスに関する上記の事項はすべて素晴らしいですが、まったく役に立たない可能性があります。
修正する もう少し考えてみると、パイプバッファサイズ64kだけがプリフェッチされます。次の修正は、すべてのファイルをメモリにインポートします。合わない場合は使用しないでください。
#!/bin/bash
fd=3
for file in *
do
eval exec $fd\<<(content=$(<$file); echo "$content")
fd=$((fd + 1))
done
out_fd=3
while [ "$out_fd" -lt "$fd" ]
do
cat <&${out_fd}
out_fd=$((out_fd + 1))
done