我正在尝试将一个持续的数据流(非常大)保存到一个二进制文件中。生成数据流的方法是
find . -name "(pattern)" | xargs -L1 awk '{(smth)}' | ./translater"translator“是一个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二进制文件所需的时间太长(>3hr)。有什么可以改进的吗?
发布于 2013-02-06 21:35:30
您正在执行awk近400万次。在我的机器上,执行awk 1000次大约需要5秒,尽管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通常是缓冲的,所以,您的翻译程序,不应该是问题。
https://stackoverflow.com/questions/14737704
复制相似问题