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