我正试图将一个连续的数据流(非常大)保存到一个二进制文件中。使用生成数据流
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
通常是缓冲的,这样和您的翻译器程序就不会有问题。