Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 27

Vadim Zhunko
5136
Vadim Zhunko  
sergeev:

Вопрос по работе с memory mapping.

Можно ли, не прибегая к копированию и пересозданию, динамически изменять размер выделенного объема памяти (CreateFileMapping) и её проекции (MapViewOfFile) ?

То есть проблема в следующем:

Создается объект CreateFileMapping в памяти для обмена данными между процессами (писатель-читатель) 100 байт. и MapViewOfFile такого же размера в 100 байт.

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

Поэтому задача - есть ли возможность расширить выделенный объем памяти без пересоздания CreateFileMapping / MapViewOfFile заново ?
Чтоб первый процесс не ждал освобождения а продолжил писать в добавленный объем, при этом второй тоже продолжил читать дальше.

Можно. Только лучше сразу побольше выделить. Быстрее работать будет. У меня в той самой библиотеке это реализовано.
TheXpert
17873
TheXpert  
Zhunko:
Можно. Только лучше сразу побольше выделить.

Эмм немного не точно.

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

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

Да и зачем вообще менять размер??

---
22644
---  
Zhunko:
Можно.
как ? в MSDN и гугл не посылай, я там полдня уже.

TheXpert:

Эмм немного не точно.

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

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

Да и зачем вообще менять размер??

в процессе работы выделенная память заполняется на все 100 байт. Но данные появляются новые и следовательно надо их дописывать. Значит надо расширить этот объем чтоб дописать их.

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

С вьюхой понял. надо только переотрывать. А вот сам объект CreateFileMapping? с ним получится не закрывая его расширить ?

Андрей
1890
Андрей  
По ходу, для чтения маппингом размер маппинга задается фиксированный в Create.
.
Вероятно, можно только пересоздавать.
.
НО: если создать sparse файл огромного размера (например, гигабайта 2),
то все будет Ок. Но конец файла нужно осмысливать вне системного file size.
.
Но тогда уже надо будет спрашивать, как синхронизовать процесс чтения из файла-
т.е. как узнать, что записана порция данных и где.
---
22644
---  

по большому счету такого объема не надо.

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

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

---
22644
---  
jartmailru:

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

эту проблему я решил сразу.

а вот с динамическим увеличением размера еще нет :(

если Вадим (Zhunko) будет так великодушен, надеюсь подскажет какие функции использовать...
Андрей
1890
Андрей  
Я повторяю: имеется такая вещь как Sparse files...
Это означает, что файл размером 2 гига занимает на дисkе 0 байт.

Хм. А задать файл под максимальный размер передаваемых
данных- нельзя?
---
22644
---  
jartmailru:
Я повторяю: имеется такая вещь как Sparse files...
Это означает, что файл размером 2 гига занимает на дисkе 0 байт.

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

// если так будет легче

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\\page");

покоя не дает мне вот этот FILE_SIZE. привязывает он к себе конкретно.

Хм. А задать файл под максимальный размер передаваемых данных- нельзя?
объем данных заранее неизвестен.
про Sparse читаю, может будут полезными. если умеют расширятся динамически.
TheXpert
17873
TheXpert  
sergeev:

в том и дело. я ж написал, что при создании указан размер = 100 байт.

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

Какая разница? Суть та же просто инфа пишется в память а не на диск. Все равно работа происходит с хендлом, открытым через CreateFile.

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

в процессе работы выделенная память заполняется на все 100 байт.

А в чем проблема? Сделал еще одну вьюшку с оффсетом 100байт, но в размере маппинга (т.е. файла) это должно быть учтено заранее.

С вьюхой понял. надо только переотрывать. А вот сам объект CreateFileMapping? с ним получится не закрывая его расширить ?

Расширять его неправильно, в его размере это должно уже быть учтено.
---
22644
---  
TheXpert:
Расширять его неправильно, в его размере это должно уже быть учтено.
кажись это единственный вариант.