我试图将一个持续的数据流(非常大)保存到二进制文件中。 该数据流是与使用管道,scanf写入float流时速度低
find . -name "(pattern)" | xargs -L1 awk '{(smth)}' | ./translater
产生的“转换器”是一个Ç代码恢复从所述第二管道中的数据流。
#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);
}
这些组合运行良好,但花费很长时间(> 3小时)生成2GB二进制文件。有什么我可以改进,以加速它?
尝试阅读和书写更大的块。 – 2013-02-06 20:03:28
你确定这是C程序慢的部分吗?您正在为每个输入文件重新执行'awk'。有多少个输入文件?如果你举一个'pattern'和'{(smth)}'的例子,那么人们会更容易帮助你回答你的问题。 – andrewdotn
管道内核缓冲区很小。很可能大部分时间都花在上下文切换上。你可能想要分析它。一个简单的测试就是将输出保存到文件中,然后将文件送入下一个阶段而不是使用shell管道。 –