c-使用管道、scanf、write转换浮点流时速度较低



我正试图将一个连续的数据流(非常大)保存到一个二进制文件中。使用生成数据流

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小时)。有什么可以改进的地方吗?

您正在执行awk近4000000次。在我的机器上,执行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

以仅执行一个CCD_ 6处理。

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

fwrite通常是缓冲的,这样和您的翻译器程序就不会有问题。

相关内容

  • 没有找到相关文章

最新更新