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