2013-02-06 31 views
0

我試圖將一個持續的數據流(非常大)保存到二進制文件中。 該數據流是與使用管道,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二進制文件。有什麼我可以改進,以加速它?

+1

嘗試閱讀和書寫更大的塊。 – 2013-02-06 20:03:28

+0

你確定這是C程序慢的部分嗎?您正在爲每個輸入文件重新執行'awk'。有多少個輸入文件?如果你舉一個'pattern'和'{(smth)}'的例子,那麼人們會更容易幫助你回答你的問題。 – andrewdotn

+0

管道內核緩衝區很小。很可能大部分時間都花在上下文切換上。你可能想要分析它。一個簡單的測試就是將輸出保存到文件中,然後將文件送入下一個階段而不是使用shell管道。 –

回答

0

您正在執行awk將近4,000,000次。在我的機器上,執行awk需要大約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過程。

如果仍然很慢,請嘗試對時間線的每個部分進行單獨計時 - 運行多長時間需要findcat/dev/null需要多長時間?運行多長時間awk

fwrite通常會被緩衝,因此您的翻譯程序不應該成爲問題。

+0

謝謝安德魯。我在awk語句中有一個'if(NR <= 141)'(每個文件600行)。我試過在awk中刪除'if()',程序運行速度非常快。現在,我認爲這是'如果'減緩了日常工作。 – Kai

+0

我更新它:'find。 -name「(pattern)」| xargs看到-n'1,141p'| awk'{print $ 2}'| 。/ translater「效果更好。 – Kai