如何在C++中实现多线程文件处理

How to multithread file processing in C++?

本文关键字:多线程 文件 处理 实现 C++      更新时间:2023-10-16

我正在处理一个问题,需要处理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个实例都运行完毕。