我正在開發一個程序,其中包含多個線程來管理來自多個攝像頭的數據流。我必須在SSD磁盤上寫入每個原始圖像。我正在使用fwrite
將圖像置於二進制文件中。例如:限制fwrite操作的CPU使用率
FILE* output;
output = fopen(fileName, "wb");
fwrite(imageData, imageSize, 1, output);
fclose(output);
該過程似乎運行得足夠快,以保存具有給定攝像機吞吐量的所有圖像。問題在於保存過程耗費CPU資源,並且由於保存線程的CPU使用情況,啓用保存進程時,我開始出現同步問題。
有什麼辦法可以減少fwrite操作的CPU負載嗎?喜歡玩緩衝,更好的DMA設置,...?
謝謝!
MIX
- 更新1
忘了多線程的軟件,這裏是一個簡單的文件刻錄軟件:
#include <stdio.h>
#include <stdlib.h>
const unsigned int TOT_DATA = 1280*2*960;
int main(int argc, char* argv[])
{
if(argc != 2)
{
printf("Usage:\n");
printf(" %s totWrite\n\n", argv[0]);
return -1;
}
char* imageData;
FILE* output;
char fileName[256];
unsigned int totWrite;
totWrite = atoi(argv[1]);
imageData = new char[TOT_DATA];
printf("Write imageData[%u] on file %u times.\n", TOT_DATA, totWrite);
for(unsigned int i = 0; i < totWrite; i++)
{
sprintf(fileName, "image_%06u.raw", i);
output = fopen(fileName, "wb");
fwrite(imageData, TOT_DATA, 1, output);
fclose(output);
}
printf("DONE!\n");
delete [] imageData;
return 0;
}
char緩衝區將被創建,它會寫上文件totWrite
次。由於每個循環寫入新文件,因此不會覆蓋。 (當然,必須刪除以前運行的文件...)
運行top
(我在Linux上)程序運行時我看到大約50%的CPU(這意味着50%的使用4個核心之一)。我認爲fwrite是CPU使用率的瓶頸,因爲它是循環中的「較慢」操作,所以當更新其狀態時,「更可能」運行該操作。即使「更可能」,如果TOT_DATA
將增加,例如100次。
關於什麼可以減少此類程序中CPU使用率的進一步考慮?
你確定fwrite消耗很多CPU嗎?它只應該被阻擋,因爲硬盤速度不是很快。不過,您可以嘗試操作系統級別的功能,如打開/寫入或CreateFile/WriteFile。 –
請勿在每次寫入時打開/關閉文件。 – Mat
@Mat不確定這是一個問題 - 它可能是'fwrite'是所有應該寫入文件的寫入。 – skyking