Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.21;
Скачать: CL | DM;

Вниз

Вопрос по 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 вся ветка

Текущий архив: 2013.07.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
2-1353827595
ДенисПФ
2012-11-25 11:13
2013.07.21
Packed Record to MemoryStream


15-1361990175
ХХХХХ
2013-02-27 22:36
2013.07.21
Как сделать паузу?


3-1286827107
well
2010-10-11 23:58
2013.07.21
Как удалить(заменить) сообщение об удалении записи?


2-1353673766
AntonMos
2012-11-23 16:29
2013.07.21
daysbetween


15-1362232290
Kerk
2013-03-02 17:51
2013.07.21
LISPообразное нечто