0

継続的なデータ ストリーム (非常に大きい) をバイナリ ファイルに保存しようとしています。データストリームはで生成されます

find . -name "(pattern)" | xargs -L1 awk '{(smth)}' | ./translater

「トランスレータ」は、2 番目のパイプからのデータ フローを復活させるためのCコードです。

#include <stdio.h>
#include <stdlib.h>

int main() {
    float buffer;
    FILE *stream;

    stream = fopen("output.bin", "wb");
    while (scanf("%f", &buffer)==1) {
        fwrite(&buffer, 1, sizeof(float), stream);
    }
    fclose(stream);
    return (0);
}

これらの組み合わせはうまく機能しますが、2GB のバイナリ ファイルを生成するには時間がかかりすぎます (>3 時間)。ターボ化するために改善できることはありますか?

4

1 に答える 1

0

awk4,000,000 回近く実行しています。私のマシンでは、何もしませんがawk、1000 回実行するのに約 5 秒かかります。awkシェルで次のように時間を設定できます。

time for ((i = 0; i < 1000; i++)); do gawk 1 < /dev/null; done

これはawk、問題の初期化時間だけで、4000 * 5 / 60 / 60 = 5.5何の作業も行わずに約数時間かかることを意味します。

試す

find . -name "(pattern)" | xargs cat | awk '{print $2}' | ./translater

1 つのプロセスのみを実行しawkます。

それでも遅い場合は、タイムラインの各部分を個別に計測してみてくださいfind。実行にかかる時間はどれくらいですか? catまでどのくらい/dev/null?実行時間はawk

fwrite通常はバッファリングされるため、翻訳プログラムは問題になりません。

于 2013-02-06T21:35:30.330 に答える