Многопоточность и boost::interprocess::mapped_region
Необходимо обработать большой файл (около 100Гб) по блокам, размером 1 Мб следующим образом: От каждого блока высчитывается хеш, и записывается в результирующий файл в том же порядке, в каком блок находился в исходном файле.
Хочу ускорить данную процедуру с помощью многопоточной обработки. Также, для ускорения операций ввода-вывода думаю использовать boost::interprocess::mapped_region в комбинации с boost::interprocess::file_mapping. Предполагаемый алгоритм работы потока следующий:
- Получить номер блока для хеширования
- Отобразить нужный блок файла в адресное пространство процесса
- Посчитать хеш
- Записать результат
- Выгрузить блок из адресного пространства
После прочтения мануалов из boost, и MSDN (по тем функциям, которые вызывает boost) все равно остался вопрос:
Безопасно ли делать отображение параллельно из нескольких потоков, с учетом того, что каждый из них будет создавать свой экземпляр mapped_region? И если да, то можно ли создать одно отображение, размером в весь на все потоки, и в каждом из них брать указатель на нужный блок данных?
Ответы (1 шт):
В результате оказалось обращение оказалось безопасным. Однако маппить сразу весь файл было плохой идеей, так как обращение к данным по смещению, превышающему доступный объем RAM вызывало серьезные замедления в работе. В качестве решения этой проблемы маппил файл блочно, по 1 гигабайту, чем и достиг желаемой производительности.