У меня проблемы с производительностью при чтении огромных файлов. Я хотел бы использовать отображение памяти для решения проблем. Входные файлы имеют размер до 10 ГБ, моя программа (написанная на C ++) построена с 32-разрядной конфигурацией, целевая система — 64-разрядная Windows и имеет 24 ГБ ОЗУ. Можно ли отобразить весь огромный файл в память? Если да, то как моя программа может получить доступ к «высокой» адресной области (> 0xFFFFFFFF, теоретически, потому что моя программа 32-битная, поэтому указатели также 32-битные)?
Ты не можешь 32-разрядная программа использует 32-разрядные указатели, которые не могут превышать 4 ГБ даже при работе в 64-разрядной ОС.
Одна вещь, которая может немного помочь, это связать вашу программу с /LARGEADDRESSAWARE
вариант. По умолчанию 32-битные программы Windows могут использовать только 2 Гб адресного пространства, потому что некоторые программы предполагают, что самый старший бит указателя всегда равен нулю, и используют его в качестве флага для хранения дополнительной информации. Это сломалось бы, если бы Windows начала выделять память более 2 ГБ, поэтому вам нужно связать свою программу с помощью специальной опции, которая сообщает Windows, что ваша программа не использует этот бит. Это позволяет вашей программе использовать все 4 ГБ адресного пространства вместо ограничения 2 ГБ.
В 32-разрядной программе вы никогда не сможете отобразить весь файл сразу в одном процессе, поскольку адресное пространство имеет длину 2 ГБ. Что возможно, так это сопоставить только часть файла в данный момент, играя с MapViewOfFile
параметры. Также возможно сопоставить весь файл одновременно с несколькими процессами, отображающими 1 ГБ каждого (поскольку отдельные процессы имеют отдельные адресные пространства), но это было бы действительно непрактично для использования.