Вам нужно выполнить параллельную обработку, а затем последовательно записать на диск (поскольку вы можете только последовательно обращаться к диску). Вы также можете избавиться от временных файлов и обрабатывать большие файлы в чанках. Любая обработка, которую вы выполняете в файле временных данных, может быть заменена чем-то (например, классом), который записывает изменения и применяет их к выходному потоку.
Запись на диск может выполняться с использованием класса буфера / синхронизации, экземпляр которого передается между потоками и который записывает каждое изменение на диск полностью перед обработкой следующего. Это самый чистый способ сделать это, и, хотя, возможно, нет необходимости избегать гонки данных (поскольку вы читаете только из входных файлов и записываете только один вывод на поток), это сделает ваш проект более понятным и обеспечит возможность расширения в будущем ( также предотвращает разброс файла в случае жестких дисков). Asio - это библиотека, предназначенная для асинхронного ввода-вывода и оснащенная пулами потоков, асинхронной обработкой файлов и многими другими полезными вещами, что означает, что вам (в основном) не нужно беспокоиться о том, что я сказал выше.
Однако, если вы не выполняете какую-то очень сложную вычислительную задачу, диск все равно будет вашим узким местом. Опять же, в зависимости от сложности обработки ваших программ, это решение может принести только минимальное усиление.
В качестве примечания вы можете вычислить имя выходного файла из имени входного файла, используя stem()
метод std::filesystem::path
. Как это:
std::filesystem::path my_path("foo.txt");
std::filesystem::path my_output_path(my_path.stem()+std::filesystem::path(".my_extension"));