如何在C++中实现多线程文件处理
How to multithread file processing in C++?
我正在处理一个问题,需要处理24个文件(每个大小=3GB),并将输出写入多个文件(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个实例都运行完毕。
相关文章:
- boost::文件系统::recursive_directory_iterator多线程安全
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- C++中的多线程文件哈希
- 我们是否需要互斥锁来执行多线程文件 IO
- Borland C++ 5.02 中使用第三方头文件的多线程
- 多线程文件 IO 程序在线程数增加时行为不可预测
- 多线程存储到文件中
- c++:写入多线程程序中的文件
- 多线程文件读取为每个线程生成相同的结果
- 通过多线程处理确定每个字符在文件中出现的次数
- c++多线程读取文件
- 多线程文件读取
- 使用C 中的Windows API使用多线程列出文件
- 用c++对文件进行多线程读取
- Visual Studio使用多线程DLL发布应用程序文件
- 多线程文件保存操作
- 如何在C++中实现多线程文件处理
- 在c++中实现高效多线程文件I/O
- 多线程文件流
- 使用c++将多线程文件复制到不同的硬盘驱动器