我試圖將一個持續的數據流(非常大)保存到二進制文件中。 該數據流是與使用管道,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管道。 –