длинные файлы

Тема в разделе "WASM.BEGINNERS", создана пользователем Perre, 23 апр 2007.

  1. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    q_q :) буду должен
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    И мне! :))
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    q_q
    Действительно сработало :))
    Интересно - почему там не захотело?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Y_Mur
    Ты об этом: "в 98й всё это безобразие ведёт себя совершенно неадекватно"?
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    q_q
    Нет в 98 всё совсем неадекватно - виртуальные файлы >2Гб в памяти нормально создаются ;))) но вот работать затем с ними не получается (можно только если виртуальный файл один и совсем маленький - типа метров 500-1000).
    А в ХР - "адекватно" - т.е. ошибка возникает сразу в CreateFileMapping, проверь - может у тебя полчится? (отличие от твоего примера - виртуальность, т.е. адресное пространство без размещения на диске реального файла с таким же размером)
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Y_Mur
    отличие от твоего примера - виртуальность, т.е. адресное пространство без размещения на диске реального файла
    Цитата MSDN CreateFileMapping: " If hFile is INVALID_HANDLE_VALUE, the calling process must also specify a size for the file mapping object in the dwMaximumSizeHigh and dwMaximumSizeLow parameters. In this scenario, CreateFileMapping creates a file mapping object of a specified size that is backed by the system paging file instead of by a file in the file system."
    Если я правильно понимаю, то, использование CreateFileMapping с параметром INVALID_HANDLE_VALUE приводит к тому, что память будет зарезервирована в файле подкачки, т.е. используется "реальный файл". Afaik 32-ух разрядная система не нуждается более чем в 4 гигабайтном файле подкачки.

    проверь - может у тебя полчится
    Проверить что?
    Ты даешь ссылку на _обрывок_ кода - я не понимаю его смысл. Пишешь, что возникают ошибки, и при этом не конкретизируешь какие именно.
    +
    До сих пор не встречал, что можно использовать связку CreateFileMapping -> MapViewOfFile -> VirtualAlloc. Не понимаю, зачем использовать VirtualAlloc, ведь MapViewOfFile создает доступный регион физической памяти.

    Если вернуться к вопросу работопригодности dwMaximumSizeHigh, то
    Код (Text):
    1. #define STRICT
    2. #define WIN32_LEAN_AND_MEAN
    3. #include <windows.h>
    4. #include <tchar.h>
    5. #include <stdio.h>
    6.  
    7. static DWORD WINAPI GetPageSize(void)
    8. {
    9.   SYSTEM_INFO si;
    10.   GetSystemInfo(&si);
    11.   return si.dwAllocationGranularity;
    12. }
    13.  
    14. static void WINAPI foo(HANDLE hFileMap, ULARGE_INTEGER ulFileSize)
    15. {
    16.   ULARGE_INTEGER ulMapOffset;
    17.   LPVOID         pBuffer;
    18.   SIZE_T         MapSize;
    19.   SIZE_T         DefMapSize = GetPageSize();
    20.  
    21.   ulMapOffset.QuadPart = 0;
    22.   while (0 != ulFileSize.QuadPart)
    23.   {
    24.     MapSize = (SIZE_T) min(DefMapSize, ulFileSize.QuadPart);
    25.  
    26.     pBuffer = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS,
    27.               ulMapOffset.HighPart, ulMapOffset.LowPart, MapSize);
    28.     if (NULL == pBuffer)
    29.     {
    30.       _tprintf(TEXT("MapViewOfFile(0x%08X%08X) failed 0x%08X"),
    31.         ulMapOffset.HighPart, ulMapOffset.LowPart, GetLastError());
    32.       return;
    33.     }
    34.  
    35.     ulFileSize.QuadPart  -= MapSize;
    36.     ulMapOffset.QuadPart += MapSize;
    37.   // TODO
    38.     RtlFillMemory(pBuffer, MapSize, 1);
    39.  
    40.     UnmapViewOfFile(pBuffer);
    41.   }
    42. }
    43.  
    44. void main(void)
    45. {
    46.   ULARGE_INTEGER ulSize;
    47.   HANDLE         hFile, hFileMap;
    48.  
    49. // 5Gb
    50.   ulSize.HighPart = 1;
    51.   ulSize.LowPart  = 1024*1024*1024;
    52.  
    53.   hFile = CreateFile(TEXT("C:\\MMFTest.dat"),
    54.             GENERIC_READ | GENERIC_WRITE,
    55.             FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    56.             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    57.   if (INVALID_HANDLE_VALUE == hFile)
    58.     _tprintf(TEXT("CreateFile failed 0x%08X"), GetLastError());
    59.   else
    60.   {
    61.     hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
    62.                  ulSize.HighPart, ulSize.LowPart, NULL);
    63.     if (NULL == hFileMap)
    64.       _tprintf(TEXT("CreateFileMapping failed 0x%08X"), GetLastError());
    65.     else
    66.     {
    67.       foo(hFileMap, ulSize);
    68.       CloseHandle(hFileMap);
    69.     }
    70.     CloseHandle(hFile);
    71.   }
    72. }
    демонстрирует, что, например, на wxpsp2pro + ntfs, можно теоретически иметь _собственную_ виртуальную память размером до (2^64 - 1).
     
  7. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    MSoft и тебе тоже )) (вот только отдать врятли смогу, я уверен что мы очень далеко друг от друга)

    q_q – зачем нужны такие объемы виртуальной памяти, не лучше ли сразу работать с файлами.
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Perre
    зачем нужны такие объемы виртуальной памяти
    Круг здачь, решаемых на компьютере, не ограничивается хелловорлд'ами, лабораторными/курсовыми, соревнованием "гуров" - чей код меньше и т.п.

    не лучше ли сразу работать с файлами
    mmf, по мимо прочего, - обертка вокруг file i/o.