Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› MapViewOfFile |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 22 мая 2008 10:51 · Личное сообщение · #1 Есть код: HANDLE hFile, hfMap, pMap;
Изначально, после маппинга, расход опер. памяти не изменился. Но как только начинаю проверять содержимое файла, расход оперативки растёт вплоть до размера файла! Можно это забороть? Или если это так и будет, как вообще работать с большими файлами, не помещая их в память? Читать по мегабайту? Но это расходы на чтение из файла, а цикл чтения вроде как скоростной. Плюс искомые данные в файде могут быть обрезанны размером буфера. Сложные проверки этих случаев - очередные тормоза цикла. ![]() |
|
Создано: 22 мая 2008 18:41 · Личное сообщение · #2 |
|
Создано: 22 мая 2008 18:42 · Личное сообщение · #3 |
|
Создано: 22 мая 2008 18:43 · Личное сообщение · #4 |
|
Создано: 22 мая 2008 18:52 · Личное сообщение · #5 |
|
Создано: 22 мая 2008 19:26 · Личное сообщение · #6 |
|
Создано: 22 мая 2008 20:17 · Личное сообщение · #7 Если файл надо прочитать один раз с начала до конца, маппинг совершенно не нужен. Тем более что если файл больше, чем размер свободного адресного пространства, то маппинг всего файла не сработает. Лучше юзать FILE_FLAG_NO_BUFFERING и обычный ReadFile. Для ускорения можно разнести чтение буфера и обработку данных в разные потоки (см. FILE_FLAG_OVERLAPPED и параметр lpOverlapped). ![]() |
|
Создано: 22 мая 2008 20:49 · Личное сообщение · #8 2reverser А вот про это можно поподробнее? ReadFile всё равно порциями читать или как-то иначе? В справке как-то расплывчато: доступ к файлу должен начинаться со смещений в файле, кратных размеру сектора тома; доступ к файлу должен выполняться для ввода/ вывода числа байтов, кратных размеру сектора тома; адреса буферов для операций чтения и записи должны быть выровнены по границам адресов памяти, кратных размеру сектора тома. Как я понял куча ограничений, а читать всё равно порционно? PS И почему нельзя тупо "просмотреть байтики файла" прямо с диска, средствами системы прыгая между фрагментами, ничего не кешируя в память... ![]() |
|
Создано: 22 мая 2008 21:02 · Личное сообщение · #9 |
|
Создано: 22 мая 2008 22:45 · Поправил: Great · Личное сообщение · #10 >>ReadFile всё равно порциями читать или как-то иначе? В справке как-то расплывчато: доступ к файлу должен начинаться со смещений в файле, кратных размеру сектора тома; доступ к файлу должен выполняться для ввода/ вывода числа байтов, кратных размеру сектора тома; адреса буферов для операций чтения и записи должны быть выровнены по границам адресов памяти, кратных размеру сектора тома. для FILE_FLAG_NO_BUFFERING? я про него чето забыл уже надо посмотреть ![]() |
|
Создано: 23 мая 2008 06:35 · Личное сообщение · #11 |
|
Создано: 23 мая 2008 09:44 · Поправил: Freecod · Личное сообщение · #12 Вообщем старым добрым ReadFile всё сделал. while (allpos < dwFileSize) // allpos - смещение по файлу
Надеюсь работать будет достаточно шустро... ![]() |
|
Создано: 23 мая 2008 10:32 · Личное сообщение · #13 |
|
Создано: 23 мая 2008 11:15 · Личное сообщение · #14 Такая же, как между яблоком и камазом. Мало общего. Может ты имел в виду VirtualAlloc & HeapAlloc? Тогда отвечаю: Операционная система позволяет выделить память постранично (страница=4кб) из-за особенностей архитектуры IA-32. Это делает функция VirtualAlloc. Ей передаешь размер и она выделяет нужное число страниц. Но часто требуется выделять меньшие объемы - сотни байт. Для этого существует куча - менеджер кучи выделяет себе несколько страниц памяти и размечает эту область на блоки (свободные/занятые). При запросе HeapAlloc менеджер кучи ищет свободный блок и возвращает указатель на него (помечая как занятый, конечно). А вызов VirtualAlloc с размером в сотню байт все равно закончится выделением одной страницы (4кб) Что лучше? Если тебе нужно выделять память размером до 4кб то лучше использовать кучу. Если больше - выделять сразу страницами ![]() |
|
Создано: 24 мая 2008 00:09 · Личное сообщение · #15 |
|
Создано: 24 мая 2008 10:28 · Поправил: Freecod · Личное сообщение · #16 А windows посылает сообщения при подключении новых устройств? Мне нужно "подхватывать" устройства (накопители естественно) в реальном времени. Пока кручу цикл GetLogicalDriveStrings(150, DrvList); GetDriveType(&DrvList[i]); , но тут сразу куча неудобств. Если диск уже добавлен (флешка например), её отключают, а потом подкл. другую - идём лесом =\ Нет способа отловить момент подключения нового диска и желательно его букву... ![]() |
|
Создано: 24 мая 2008 13:28 · Личное сообщение · #17 |
|
Создано: 25 мая 2008 08:26 · Личное сообщение · #18 |
|
Создано: 27 мая 2008 09:18 · Поправил: Freecod · Личное сообщение · #19 |
<< . 1 . 2 . |
![]() |
eXeL@B —› Программирование —› MapViewOfFile |