[英]How to multithread file processing in C++?
我正在處理一個問題,我需要處理24個文件(每個大小= 3 GB)並將輸出寫入多個文件(24個)。 每個文件大約需要1個小時來處理。 是否可以通過以下代碼使用多線程將數據同時寫入多個文件中?
int _tmain(int argc, _TCHAR* argv[])
{
std::string path;
cout << "Enter the folder of the logs: " << endl;
cin >> path;
WIN32_FIND_DATA FileInformation; // File information
memset(&FileInformation, 0, sizeof(WIN32_FIND_DATA));
std::string strExt = "\\*.txt";
std::string strEscape = "\\";
std::string strPattern = path + strExt;
HANDLE hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
while(hFile != INVALID_HANDLE_VALUE)
{
int offset;
std::ifstream Myfile;
std::string strFileName = FileInformation.cFileName;
std:: string fullPath = path + strEscape + strFileName;
std::string outputFile = path + strEscape + strFileName.substr(0, strFileName.length()-3) + "processed"+".txt";
std::ofstream ofs(outputFile, std::ofstream::out);
Myfile.open (fullPath);
std::string line;
if(Myfile.is_open())
{
while(!Myfile.eof())
{
-------Processing--------
}
Myfile.close();
}
else
cout<<"Cannot open file."<<endl;
if(FindNextFile(hFile, &FileInformation) == FALSE)
break;
}
// Close handle
::FindClose(hFile);
return 0;
}
查看您的代碼,我假設您從一個輸入生成一個輸出文件。 在這種情況下,您無需編寫多線程代碼即可檢查一次處理多個文件是否可以加快處理速度。 只需修改程序以接受文件名作為參數,然后並行運行多個文件即可。 但是,除非您要從SSD驅動器讀/寫,否則這種並行處理很可能會減慢處理速度,因為硬盤驅動器將不得不在多個位置的讀/寫之間切換,並且磁頭定位很慢。
目前尚不清楚您在處理什么,但是如果占用100%的CPU,那么您很可能會通過多個線程處理一個文件來顯着加快處理速度。 您將讀取一個線程,然后處理線程池,然后寫入一個線程。 棘手的部分是同步數據,並使其不以錯誤的順序出現在輸出文件中。
不要在這里編寫多線程代碼,而要編寫多進程代碼。 也就是說,讓您的程序處理一個文件(作為參數傳遞),並從腳本中並行調用多次。
不要同時運行程序24次(除非您有24個內核和72GB的可用內存)。 嘗試同時運行2個,4個或6個實例,並查看最佳實例。 我想這將是核心數量,也許是核心數量* 2-1(超線程確實有幫助)。 試試看。
另外,如果您的程序從頭開始讀取文件,然后執行計算,然后寫入結果,請測量讀取3GB數據所需的時間。 例如,如果是30秒,並且您同時運行4個進程,請讓運行腳本啟動第一個實例,然后等待45秒,然后啟動第二個實例,依此類推,直到第四個實例。 前四個實例之一完成后,請啟動第五實例。 每次其他實例完成時,請運行下一個實例,直到所有24個實例都已運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.