0

我正在尝试将持续的数据流(非常大)保存到二进制文件中。数据流是用生成的

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

“转换器”是一个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

您正在执行awk近 4,000,000 次。在我的机器上执行 1000 次大约需要 5 秒awk,即使awk什么都不做。你可以在 shell 中这样计时:

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

只执行一个awk进程。

如果这仍然很慢,请尝试单独为时间线的每个部分计时——find运行需要多长时间?多久cat/dev/null?跑多长时间awk

fwrite通常是缓冲的,因此您的翻译程序不应该是问题。

于 2013-02-06T21:35:30.330 回答