Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1353340493
toropoff
2012-11-19 19:54
2013.07.21
bass.dll


15-1362136963
Nestor
2013-03-01 15:22
2013.07.21
Как определить, содержит ли окно рендер игры?


3-1291201543
StriderMan
2010-12-01 14:05
2013.07.21
isc_shutinprog


4-1264756803
Handbrake
2010-01-29 12:20
2013.07.21
Вопрос по memory mapped files


3-1286969311
yurikon
2010-10-13 15:28
2013.07.21
Выделение строки в гриде цветов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский