Форум: "WinAPI";
Текущий архив: 2013.07.21;
Скачать: [xml.tar.bz2];
ВнизВопрос по memory mapped files Найти похожие ветки
← →
Handbrake (2010-01-29 12:20) [0]Такое можно реализовать?
Создать unnamed file mapping object и записывать в него числа (тип longint) по мере их поступления (например, в цикле), количество чисел заранее неизвестно. Т.е. я предполагаю по мере необходимости наращивать размер file mapping object (блоками, например, по 64 K).
Буду признателен за помощь.
← →
Игорь Шевченко © (2010-01-29 15:33) [1]FileMapping не наращивается. Но никто не мешает создать FileMapping заранее большого объема и писать туда данные, указав в начале их количество.
Точно также, как никто не мешает писать просто в файл, он наращивается.
← →
Handbrake (2010-01-29 16:16) [2]Игорь, спасибо!
Записать просто в файл в моем случае - медленно.
Я боюсь сбить Вас с толку, т.к. сам еще плыву по MMF, но такое что, не будет работать, навскидку?:
AdrBase,AdrLongint:PLongint;
// Создаем ...
BLOCK_SIZE := 65536;
FS := BLOCK_SIZE;
HFile := FileCreate("C:\Longint.zzz");
HMap := CreateFileMapping( HFile, NIL, PAGE_READWRITE, 0, BLOCK_SIZE, NIL );
AdrBase := MapViewOfFile(HMap, FILE_MAP_WRITE,0,0,BLOCK_SIZE );
// когда добавляем очередной longint, то в случае, если некуда уже писать
// делаем
SetFilePointer(HFile, FS + BLOCK_SIZE, nil,FILE_BEGIN);
UnmapViewOfFile(AdrBase);
CloseHandle(HMap);
SetEndOfFile(HFile);
HMap := CreateFileMapping( HFile, NIL , PAGE_READWRITE, 0,FS,nil);
AdrBase := MapViewOfFile(HMap, FILE_MAP_WRITE, 0,0,FS);
AdrLongint := Pointer(Longint(AdrBase) + LONGINT_SIZE * LongintCount);=
AdrLongint^ := NewLongintValue;
LongintCount := LongintCount + 1;
← →
Игорь Шевченко © (2010-01-29 16:56) [3]
> Записать просто в файл в моем случае - медленно.
То же самое, что и с FileMapping по скорости.
> Я боюсь сбить Вас с толку, т.к. сам еще плыву по MMF, но
> такое что, не будет работать, навскидку?:
Навскидку будет, но медленнее, чем просто запись в файл.
К тому же, я изначально из вопроса предполагал, что MMF не будет поддерживаться файлом на диске.
Для "обменного файла" вполне можно использовать файл с атрибутами
FILE_FLAG_DELETE_ON_CLOSE и FILE_ATTRIBUTE_TEMPORARY, в этом случае большинство операций чтения/записи будут происходить в системном кэше, без записи на диск.
подробнее:
http://transl-gunsmoker.blogspot.com/2009/02/blog-post_11.html
← →
Handbrake (2010-01-29 19:55) [4]Ok Игорь!
Почитаю, там мне тоже еще разбираться надо.
Сейчас нет доступа к Делфи, но когда Ваше
> изначально из вопроса предполагал, что MMF не будет поддерживаться
> файлом на диске
Т.е. HFile := INVALID_HADLE_VALUE, то у меня данные (лонгинты) записывались только в последний блок. (Об этом говорим???)
Но именно такую реализацию я и хотел! (Но чтоб, конечно, писалось (и читалось!) по всем блокам ).
Да, еще: это не для общего доступа, просто нужна скорость и памяти поменьше.
В понедельник посмотрю. Дальше не хочу Вас отвлекать. Спасибо!
← →
Rouse_ © (2010-01-29 20:54) [5]Если HFile := INVALID_HADLE_VALUE то будет производится работа с использованием файла подкачки.
← →
SPeller © (2010-02-14 06:03) [6]А зачем MMF, если это не для обмена?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2013.07.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.002 c