Можно ли создать более мелкие отображения в памяти для файла размером более 2 ГБ? - PullRequest
2 голосов
/ 24 февраля 2011

Я написал класс C ++ для Windows и Linux, который создает представление с отображением в памяти для файла произвольного размера n. Код для конструктора класса можно увидеть здесь . В настоящее время я тестирую код на Windows 32 бит XP.

Я обнаружил, что для размеров файлов 0 = 2 ГБ MapViewOfFile возвращает значение NULL и код ошибки 8: «Недостаточно памяти для обработки этой команды». Очевидно, Windows не может найти доступное адресное пространство размером 2 ГБ в процессе.

Следовательно, мне может понадобиться изменить конструктор класса, чтобы создать набор меньших отображаемых в память представлений общим объемом> = 2 ГБ байт && <2 ^ 32 - 1 байт. Другое требование состоит в том, чтобы создать сопоставление между каждым из меньших отображенных в память представлений и произвольно доступным адресом в адресном пространстве процесса. </p>

Ранее я использовал следующий код для произвольного доступа:

char* KeyArray;

try {
    mmapFile = new cMemoryMappedFile(n);
}
catch (cException e)
{
    throw;
}

KeyArray = (char *)(mmapFile->GetPointer());
KeyArray[i] = ...

Как мне изменить класс для удовлетворения этих требований?

Ответы [ 5 ]

3 голосов
/ 24 февраля 2011

Вы только имеете 2 ГБ (или 3 ГБ, с некоторыми настройками) пространства пользовательских процессов в 32-разрядной ОС.Период.Это жесткое ограничение, и никакое создание множества меньших отображений не может обойти это.Вам нужно будет переместить ваше отображение, чтобы получить доступ к различным частям файла.Но это все равно будет быстрее, чем поиск, чтение и запись.

3 голосов
/ 24 февраля 2011

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

2 голосов
/ 06 августа 2011

Я не вижу вашу ссылку для вставки, но могу предложить простое решение с объявлением класса c ++. Я думаю, что реализация должна быть очевидна из комментариев:

class ShiftingMemMap
{
public:
    // constructs a dynamically shifting memory map of a file...
    ShiftingMemMap ( const char* fileName, size_t view_size = 4096 );

    // retrieve/set a byte at the given file offset. If the offset is not currently in-view,
    // shift the view to encompass the offset. The reference should not be stored for later
    // access because the view may need to shift again...
    byte& operator [] ( unsigned int_64_t offset );

private:
    int_64_t current_offset;
    size_t current_size;
};

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

class MemMap
{
public:
    MemMap ( const char* filename );

    shared_ptr<MemMapView> View ( unsigned int_64_t offset, size_t size = 4096 );
};

class MemMapView
{
public:
    char& operator[] ( size_t offset );
};
2 голосов
/ 24 февраля 2011

Это не сработает. Вы просто не можете использовать все 4 ГБ адресного пространства в 32-битной Windows. Перепроектируйте свой доступ к массиву, чтобы отобразить только небольшие представления большого файла.

0 голосов
/ 10 сентября 2011

Да, можно написать класс C ++ для Windows, Solaris Unix, Linux, который создает представление с отображением в памяти для файла произвольного размера n.Мы только что закончили сборку двух версий класса, одна с использованием STL, а другая, написанная моим боссом, не использует STL.Обе версии лучше, чем использование кучи, когда размер выделения памяти составляет 1 гигабайт или более в 32-битных Windows, Linux, Solaris Unix.Обе эти версии также совместимы с 64-битными Windows, Linux, Solaris Unix.Если вы хотите узнать больше об этом, пожалуйста, напишите мне по адресу frankchang91@gmail.com.Массачусетс, США.Эти 2 версии были разработаны независимо друг от друга и могут стать частью патентной заявки США на объединение данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...