Использование файлов с отображением памяти для временных массивов программы?

В настоящее время я пишу программу, которая сможет обрабатывать данные ядра. Поэтому я обрабатываю файлы размером от 1 МБ до 50 ГБ (и, возможно, больше в будущем).

Я прочитал несколько руководств по файлам с отображением памяти и теперь использую файлы с отображением памяти для управления вводом-выводом данных, то есть чтением и записью данных с/на жесткий диск.

Теперь я также обрабатываю данные и мне нужны временные массивы того же размера, что и данные. Теперь мой вопрос заключается в том, следует ли мне также использовать файлы с отображением памяти для этого или я должен каким-то образом управлять им с помощью ОС без явного определения файлов с отображением памяти. Проблема заключается в следующем:

Я работаю на нескольких платформах, но всегда с 64-битными системами. Теоретически 64-битного виртуального адресного пространства вполне достаточно для моих нужд. Однако в Windows максимальное виртуальное адресное пространство, по-видимому, ограничено операционной системой, т. е. пользователь может установить, разрешена ли подкачка и какой максимальный размер виртуальной памяти разрешен. Также я где-то читал, что максимальная виртуальная память в Windows 64 не 2 ^ 64, а где-то 2 ^ 40 или около того, что все еще было бы достаточно для меня, но кажется довольно странным ограничением. Кроме того, в Windows есть некоторые странные ограничения, такие как массивы с максимальным размером 2^31 элемента, независимо от типа массива. Я не знаю, как все это обрабатывается в Linux, но я думаю, что это делается аналогично. Вероятно, максимально допустимая виртуальная память = OS-RAM + размер раздела подкачки? Так что есть много вещей, с которыми нужно бороться, если я хочу использовать систему для обработки моих данных, превышающих размер оперативной памяти. Я даже не знаю, смогу ли я каким-то образом использовать в С++ все 64-битное виртуальное адресное пространство. В моем коротком тесте я получил ошибку компилятора, не способную инициализировать mot, чем 2 ^ 31 элемент, но я думаю, что легко выйти за рамки этого, используя std::vector и тому подобное.

Однако, с другой стороны, при использовании файла с отображением памяти данные всегда будут записываться на жесткий диск со всеми моими операциями записи в память. Особенно для данных, которые меньше моей физической памяти, это должно быть довольно большим узким местом. Или он избегает записи до тех пор, пока не потребуется, потому что ОЗУ превышено ??? Преимущества файлов с отображением памяти возникают при межпроцессных взаимодействиях с общей памятью или временных взаимодействиях, например, я запускаю приложение, записываю что-то, закрываю приложение, а затем перезапускаю его и эффективно читаю только те данные в ОЗУ, которые мне нужны. Поскольку мне нужно обрабатывать все данные и только в одном экземпляре выполнения с одним процессом, оба преимущества в моем случае не проявляются.

Примечание. Потоковый подход в качестве альтернативного решения моей проблемы на самом деле невозможен, поскольку я сильно завишу от случайного доступа к данным.

В идеале я хотел бы иметь способ, с помощью которого я мог бы обрабатывать все модели независимо от их размера и ограничений набора операционных ограничений, но обрабатывать все, что возможно в ОЗУ, и только в случае превышения физического ограничения использовать файлы с отображением памяти или другие механизмы ( если есть какие-либо другие) для подкачки ОЗУ, превышающего данные, идеально управляемые операционной системой.

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


person Theo    schedule 09.09.2013    source источник
comment
кстати: отличная статья о виртуальной памяти в Windows: блоги .technet.com/b/markrussinovich/archive/2008/11/17/ Это указывает на то, что максимальный объем виртуальной памяти, пока новый не вернет 0, обычно примерно в 1-3 раза превышает размер ОЗУ. Поэтому я думаю, что мне все равно нужно искать свои собственные файлы с отображением памяти, если ни у кого нет другой идеи.   -  person Theo    schedule 09.09.2013


Ответы (2)


Может быть, немного поздно, но это интересный вопрос.

Однако, с другой стороны, при использовании файла с отображением памяти данные всегда будут записываться на жесткий диск со всеми моими операциями записи в память. Особенно для данных, которые меньше моей физической памяти, это должно быть довольно большим узким местом. Или он избегает записи до тех пор, пока не потребуется, потому что ОЗУ превышено ???

Чтобы избежать записи на диск, пока есть достаточно памяти, вы должны открыть файл как «временный» (FILE_ATTRIBUTE_TEMPORARY) с помощью FILE_FLAG_DELETE_ON_CLOSE. Это подскажет ОС отложить запись на диск как можно дольше.

Что касается ограничений на размер массива: вероятно, лучше всего предоставить свои собственные структуры данных и доступ к отображаемым представлениям. Для больших наборов данных вы можете использовать несколько разных (меньших) отображенных представлений, которые вы можете сопоставлять и удалять по мере необходимости.

person Danny_ds    schedule 23.12.2015

Поскольку никто не ответил, я сам обновлю статус вопроса.

После того, как я сегодня, к счастью, столкнулся с библиотекой межпроцессного взаимодействия boost, я нашел manage_mapped_file, который даже позволяет мне выделять векторы в отображаемом диапазоне, что делает их почти такими же простыми в использовании, как программирование вообще без сопоставленных файлов.

Кроме того, я обнаружил, что:

Если несколько процессов сопоставляют один и тот же файл, и процесс изменяет диапазон памяти из отображаемой области, которая также отображается другим процессом, изменения сразу видны другим процессам. Однако содержимое файла на диске обновляется не сразу, так как это снижает производительность (запись на диск происходит в несколько раз медленнее, чем запись в память). Если пользователь хочет убедиться, что содержимое файла было обновлено, он может сбросить диапазон из представления на диск.

http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

Так что, надеюсь, он начнет писать только после того, как я превысю физическую оперативную память системы. Я еще не делал никаких замеров скорости и, вероятно, не буду делать некоторые из них.

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

person Theo    schedule 23.09.2013
comment
Цитата: Пока не делал замеры скорости. Конечно, таким образом, что бы вы ни делали, всегда будет звучать хорошо. У вас есть очень опасные неверные представления о том, как работают операционные системы виртуальной памяти с подкачкой по запросу. Слишком большая тема, чтобы охватить ее в ответе, об этом есть отличные книги. Вы не ошибетесь, написав вводный текст об операционных системах и внутреннем устройстве Windows Руссиновича. MMF являются основой работы Windows. - person Hans Passant; 24.09.2013