Why File Mapping

Тема в разделе "WASM.WIN32", создана пользователем SolidCode, 28 янв 2005.

  1. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Чем так хорош способ мэппирования файлов против обычного? Я сначала начал его использовать. Но потом не нашёл реальной выгоды.

    Особенно, когда выделяешь смещение от начала файла. Приходится выравнивать. Говорят по .dwPageSize надо. А WinXP не хочет, говорит ошибка выравнивания. А кроме того, часть файла загружается зря.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Всё зависит от конкретных целей - иногда лучше мапить, иногда читать.
     
  3. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Конкретный пример - сортировка файла. Полюбоому лучше мапить. Другой вариант - проигрывание звука, весь файл в буфер грузится долго и каждый раз читать не получается, тогда легче копировать из образа кусками.
     
  4. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Просто его MapViewOfFile - это обёртка вокруг

    VirtualAlloc

    SetFilePointer

    ReadFile



    Только отдельно они гибче - не надо выравнивать смещение в файле по размеру страниц в памяти. Только в XP он не стал брать выравнивание по 4Кб. Но sysinfo возвращает именно такое значение, а в SDK рекомендуют именно его.



    Я-то ладно, не гордый. Сам догадаюсь, что можно хард-кодить 64Кб и голову не морочить. Но где гарантия, что в будущем не будет выравнивания, скажем, по 1Мб?
     
  5. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Я, конечно, чукча, но мне кажется, что на уровне, приближенном к ядру, чтение реализуется путём маппинга и копирования из замапенного...
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SolidCode >




    Странно, у меня это обёртка вокруг других ф-ций:

    MapViewOfFile -> NtMapViewOfSection -> MmMapViewOfSection ...



    это основное приимущество: можно замапить большой файл, но "физически" данные окажутся в памяти только при обращении к ним.
     
  7. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    S_T_A_S_



    Нет, я образно выражался, что данный набор функций делает то же самое.



    Ты хочешь сказать, что можно весь фильм (700Мб) а то и 10Гб замапить полностью, а загрузка будет лишь при обращении к выделенному указателю?

    Я читал, что размер выделяемого куска ограничен размером свопа. А тот более 2Гб не бывает.
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SolidCode

    можно весь фильм (700Мб) ... замапить полностью

    w2k+ - без проблем. w9x имеет особенности. Читай о них у Рихтера в 13 и 17 главах.



    10Гб замапить полностью

    Теоретически, судя по документации, максимальный размер куска для w32 составляет (2^32)-1, а для w64 - (2^64)-1.



    Я читал, что размер выделяемого куска ограничен размером свопа. А тот более 2Гб не бывает.

    Причем тут своп? Ссылку пожалуйста.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SolidCode >




    А куда 10гиг мапить-то? адресное пространство процесса 2<sup>32</sup> байт