Многопоточность и boost::interprocess::mapped_region

Необходимо обработать большой файл (около 100Гб) по блокам, размером 1 Мб следующим образом: От каждого блока высчитывается хеш, и записывается в результирующий файл в том же порядке, в каком блок находился в исходном файле.

Хочу ускорить данную процедуру с помощью многопоточной обработки. Также, для ускорения операций ввода-вывода думаю использовать boost::interprocess::mapped_region в комбинации с boost::interprocess::file_mapping. Предполагаемый алгоритм работы потока следующий:

  1. Получить номер блока для хеширования
  2. Отобразить нужный блок файла в адресное пространство процесса
  3. Посчитать хеш
  4. Записать результат
  5. Выгрузить блок из адресного пространства

После прочтения мануалов из boost, и MSDN (по тем функциям, которые вызывает boost) все равно остался вопрос:

Безопасно ли делать отображение параллельно из нескольких потоков, с учетом того, что каждый из них будет создавать свой экземпляр mapped_region? И если да, то можно ли создать одно отображение, размером в весь на все потоки, и в каждом из них брать указатель на нужный блок данных?


Ответы (1 шт):

Автор решения: Timur Yalimov

В результате оказалось обращение оказалось безопасным. Однако маппить сразу весь файл было плохой идеей, так как обращение к данным по смещению, превышающему доступный объем RAM вызывало серьезные замедления в работе. В качестве решения этой проблемы маппил файл блочно, по 1 гигабайту, чем и достиг желаемой производительности.

→ Ссылка