Конференция "WinAPI" » Вопрос по memory mapped files
 
  • Handbrake (29.01.10 12:20) [0]
    Такое можно реализовать?
    Создать unnamed file mapping object и записывать в него числа (тип longint) по мере их поступления (например, в цикле), количество чисел заранее неизвестно. Т.е. я предполагаю по мере необходимости наращивать размер file mapping object (блоками, например, по 64 K).
    Буду признателен за помощь.
  • Игорь Шевченко © (29.01.10 15:33) [1]
    FileMapping не наращивается. Но никто не мешает создать FileMapping заранее большого объема и писать туда данные, указав в начале их количество.
    Точно также, как никто не мешает писать просто в файл, он наращивается.
  • Handbrake (29.01.10 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;


  • Игорь Шевченко © (29.01.10 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 (29.01.10 19:55) [4]
    Ok Игорь!

    Почитаю, там мне тоже еще разбираться надо.
    Сейчас нет доступа к Делфи, но когда Ваше


    > изначально из вопроса предполагал, что MMF не будет поддерживаться
    > файлом на диске


    Т.е. HFile := INVALID_HADLE_VALUE, то у меня данные (лонгинты) записывались только в последний блок. (Об этом говорим???)

    Но именно такую реализацию я и хотел! (Но чтоб, конечно, писалось (и читалось!) по всем блокам ).
    Да, еще: это не для общего доступа, просто нужна скорость и памяти поменьше.

    В понедельник посмотрю. Дальше не хочу Вас отвлекать. Спасибо!
  • Rouse_ © (29.01.10 20:54) [5]
    Если HFile := INVALID_HADLE_VALUE то будет производится работа с использованием файла подкачки.
  • SPeller © (14.02.10 06:03) [6]
    А зачем MMF, если это не для обмена?
 
Конференция "WinAPI" » Вопрос по memory mapped files
Есть новые Нет новых   [137674   +21][b:0][p:0.001]