Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вопрос по работе с memory mapping.
Можно ли, не прибегая к копированию и пересозданию, динамически изменять размер выделенного объема памяти (CreateFileMapping) и её проекции (MapViewOfFile) ?
То есть проблема в следующем:
Создается объект CreateFileMapping в памяти для обмена данными между процессами (писатель-читатель) 100 байт. и MapViewOfFile такого же размера в 100 байт.
Пишущий первый порцесс может написать в память все 100 байт данных, которые не успеет выгрести второй читающий процесс.
Поэтому задача - есть ли возможность расширить выделенный объем памяти без пересоздания CreateFileMapping / MapViewOfFile заново ?
Чтоб первый процесс не ждал освобождения а продолжил писать в добавленный объем, при этом второй тоже продолжил читать дальше.
Можно. Только лучше сразу побольше выделить.
Эмм немного не точно.
У маппинга вообще нет размера, при создании указывается только максимальный размер, обычно (и по умолчанию) равный размеру файла, с которым работаем.
У вьюхи размер задается при создании и изменить его без функции UnmapViewOfFile можно только в случае шаманства в флагами доступа, а может и вообще нельзя.
Да и зачем вообще менять размер??
Можно.
Эмм немного не точно.
У маппинга вообще нет размера, при создании указывается только максимальный размер, обычно (и по умолчанию) равный размеру файла, с которым работаем.
в том и дело. я ж написал, что при создании указан размер = 100 байт.
во-вторых я работаю не с физическим файлом, а просто с памятью. один процесс передает инфу другому процессу.
Да и зачем вообще менять размер??
в процессе работы выделенная память заполняется на все 100 байт. Но данные появляются новые и следовательно надо их дописывать. Значит надо расширить этот объем чтоб дописать их.
поэтому и спрашиваю - как расширить выделенные 100 байт не прибегая к промежуточному копированию и пересозданию заново.
С вьюхой понял. надо только переотрывать. А вот сам объект CreateFileMapping? с ним получится не закрывая его расширить ?
.
Вероятно, можно только пересоздавать.
.
НО: если создать sparse файл огромного размера (например, гигабайта 2),
то все будет Ок. Но конец файла нужно осмысливать вне системного file size.
.
Но тогда уже надо будет спрашивать, как синхронизовать процесс чтения из файла-
т.е. как узнать, что записана порция данных и где.
по большому счету такого объема не надо.
процессы просто асинхронно пишут/читают. и нужен способ чтоб пишущий не испытывал неудоства от ожидания, пока читающий выгребет все записанное.
то есть надо что-то типа ArrayResize иметь, чтоб массив без изменения содержимого расширить. как только читающий забрал все данные, то память снова вся доступна для записи с начала.
Но тогда уже надо будет спрашивать, как синхронизовать процесс чтения из файла-
т.е. как узнать, что записана порция данных и где.
эту проблему я решил сразу.
а вот с динамическим увеличением размера еще нет :(
если Вадим (Zhunko) будет так великодушен, надеюсь подскажет какие функции использовать...Это означает, что файл размером 2 гига занимает на дисkе 0 байт.
Хм. А задать файл под максимальный размер передаваемых
данных- нельзя?
Я повторяю: имеется такая вещь как Sparse files...
Это означает, что файл размером 2 гига занимает на дисkе 0 байт.
я не пользуюсь файлами, все делается через память. писал выше уже три раза.
// если так будет легче
CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\\page");
покоя не дает мне вот этот FILE_SIZE. привязывает он к себе конкретно.
про Sparse читаю, может будут полезными. если умеют расширятся динамически.
в том и дело. я ж написал, что при создании указан размер = 100 байт.
во-вторых я работаю не с физическим файлом, а просто с памятью. один процесс передает инфу другому процессу.
Какая разница? Суть та же просто инфа пишется в память а не на диск. Все равно работа происходит с хендлом, открытым через CreateFile.
Вот там (при создании в памяти файла) необходимо указать максимально возможный размер, сверх которого точно инфы не будет.
в процессе работы выделенная память заполняется на все 100 байт.
А в чем проблема? Сделал еще одну вьюшку с оффсетом 100байт, но в размере маппинга (т.е. файла) это должно быть учтено заранее.
С вьюхой понял. надо только переотрывать. А вот сам объект CreateFileMapping? с ним получится не закрывая его расширить ?
Расширять его неправильно, в его размере это должно уже быть учтено.