Я работаю над одной проблемой, где мне нужно обработать 24 файла (каждый размер = 3 ГБ) и записать вывод в несколько файлов (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% ресурсов ЦП, то, скорее всего, вы значительно ускорите процесс, обрабатывая один файл несколькими потоками. У вас будет одно чтение потока, затем обработка пула потоков, затем запись одного потока. Сложнее было бы синхронизировать данные и не отображать их в выходном файле в неправильном порядке.
Не пишите многопоточный код здесь, пишите многопроцессорный код. То есть ваша программа должна обработать один файл (который передается в качестве аргумента) и вызывать его несколько раз параллельно из сценария.
Не запускайте свою программу 24 раза одновременно (если у вас нет 24 ядер и 72 ГБ памяти). Попробуйте запустить 2, 4 или 6 экземпляров одновременно и посмотрите, что лучше. Я думаю, это будет количество ядер, может быть, количество ядер * 2 — 1 (гиперпоточность помогает). Попробуйте это.
Кроме того, если ваша программа читает файл в начале, затем выполняет вычисления, а затем записывает результат, измеряет время, необходимое для чтения 3 ГБ данных. Если это, например, 30 секунд, и вы запускаете 4 процесса одновременно, ваш сценарий запуска должен запустить первый экземпляр, затем подождать 45 секунд, затем запустить второй и так далее до четвертого. Запустите пятый экземпляр, как только закончится один из первых четырех. Каждый раз, когда заканчивается другой экземпляр, запускайте следующий, пока все 24 не будут запущены.