Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› MapViewOfFile
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 мая 2008 10:51
· Личное сообщение · #1

Есть код:
HANDLE hFile, hfMap, pMap;

hFile = CreateFile(name,GENERIC_READ || GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if (hFile == INVALID_HANDLE_VALUE) {return 0;}

dwFileSize = GetFileSize(hFile,0);
if (dwFileSize <= 16 || dwFileSize >= 500000000) {return 0;}

hfMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hfMap == NULL) {return 0;}

pMap = MapViewOfFile(hfMap,FILE_MAP_READ,0,0,0);
if (pMap == NULL) {return 0;}

CHAR *s = (CHAR*)((DWORD)(pMap));

while (s[Cur] < '0' || s[Cur] > '9')
{
Cur++;
if (Cur >= dwFileSize) {return 1;}
}


Изначально, после маппинга, расход опер. памяти не изменился. Но как только начинаю проверять содержимое файла, расход оперативки растёт вплоть до размера файла! Можно это забороть?

Или если это так и будет, как вообще работать с большими файлами, не помещая их в память? Читать по мегабайту? Но это расходы на чтение из файла, а цикл чтения вроде как скоростной. Плюс искомые данные в файде могут быть обрезанны размером буфера. Сложные проверки этих случаев - очередные тормоза цикла.



Ранг: 14.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 22 мая 2008 18:41
· Личное сообщение · #2

>>SetPriorityClass - LOW не помогает...
В который раз повторяю) Приоритет != размер кванта. Если в системе нет других готовых к выполнению потоков того же или высшего приоритета, то все процессорное время будет отнимать твой поток.



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 мая 2008 18:42
· Личное сообщение · #3

не консоль =\



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 мая 2008 18:43
· Личное сообщение · #4

Great пишет:
>>SetPriorityClass - LOW не помогает...
В который раз повторяю) Приоритет != размер кванта. Если в системе нет других готовых к выполнению потоков того же или высшего приоритета, то все процессорное время будет отнимать твой поток.

Стало быть как...?




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 22 мая 2008 18:52
· Личное сообщение · #5

Руками ограничивай работу потока, который выполняет тяжелую работу.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 2.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 мая 2008 19:26
· Личное сообщение · #6

просто замути слип где-нибудь sleep(1) например



Ранг: 58.0 (постоянный), 13thx
Активность: 0.020.01
Статус: Участник

Создано: 22 мая 2008 20:17
· Личное сообщение · #7

Если файл надо прочитать один раз с начала до конца, маппинг совершенно не нужен. Тем более что если файл больше, чем размер свободного адресного пространства, то маппинг всего файла не сработает. Лучше юзать FILE_FLAG_NO_BUFFERING и обычный ReadFile. Для ускорения можно разнести чтение буфера и обработку данных в разные потоки (см. FILE_FLAG_OVERLAPPED и параметр lpOverlapped).



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 мая 2008 20:49
· Личное сообщение · #8

2reverser
А вот про это можно поподробнее? ReadFile всё равно порциями читать или как-то иначе? В справке как-то расплывчато: доступ к файлу должен начинаться со смещений в файле, кратных размеру сектора тома; доступ к файлу должен выполняться для ввода/ вывода числа байтов, кратных размеру сектора тома; адреса буферов для операций чтения и записи должны быть выровнены по границам адресов памяти, кратных размеру сектора тома.
Как я понял куча ограничений, а читать всё равно порционно?

PS И почему нельзя тупо "просмотреть байтики файла" прямо с диска, средствами системы прыгая между фрагментами, ничего не кешируя в память...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 22 мая 2008 21:02
· Личное сообщение · #9

Freecod пишет:
PS И почему нельзя тупо "просмотреть байтики файла" прямо с диска, средствами системы прыгая между фрагментами, ничего не кешируя в память...

потому что процессор соединен с оперативной памятью, а не жеским диском

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 14.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 22 мая 2008 22:45 · Поправил: Great
· Личное сообщение · #10

>>ReadFile всё равно порциями читать или как-то иначе? В справке как-то расплывчато: доступ к файлу должен начинаться со смещений в файле, кратных размеру сектора тома; доступ к файлу должен выполняться для ввода/ вывода числа байтов, кратных размеру сектора тома; адреса буферов для операций чтения и записи должны быть выровнены по границам адресов памяти, кратных размеру сектора тома.

для FILE_FLAG_NO_BUFFERING? я про него чето забыл уже надо посмотреть



Ранг: 2.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 мая 2008 06:35
· Личное сообщение · #11

такую обсуждение на пустом месте развели
человеку файл просто надо прочитать а тут чего уже только не наговорили =)



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 23 мая 2008 09:44 · Поправил: Freecod
· Личное сообщение · #12

Вообщем старым добрым ReadFile всё сделал.
while (allpos < dwFileSize) // allpos - смещение по файлу
{
if (dwFileSize - allpos > SizeReadBuffer) // SizeReadBuffer - размер кучи
{
SetFilePointer(hFile,allpos,0,0);
sizebuf = SizeReadBuffer;
ReadFile(hFile, pMem, sizebuf, &dwBytes, 0);
r = ParseMem(s, sizebuf, &pos, FALSE);
}
else {
SetFilePointer(hFile,allpos,0,0);
sizebuf = dwFileSize - allpos;
ReadFile(hFile, pMem, sizebuf, &dwBytes, 0);
r = ParseMem(s, sizebuf, &pos, TRUE);
}
allpos = allpos+pos; // если встречены нужные данные, но буфер кончается
}


Надеюсь работать будет достаточно шустро...



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 23 мая 2008 10:32
· Личное сообщение · #13

Кстати, а в чём разница между VirtualAlloc и CreateHeap? ЧТо приминительно к этой задаче лучше?



Ранг: 14.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 23 мая 2008 11:15
· Личное сообщение · #14

Такая же, как между яблоком и камазом. Мало общего.
Может ты имел в виду VirtualAlloc & HeapAlloc?
Тогда отвечаю:
Операционная система позволяет выделить память постранично (страница=4кб) из-за особенностей архитектуры IA-32. Это делает функция VirtualAlloc. Ей передаешь размер и она выделяет нужное число страниц.
Но часто требуется выделять меньшие объемы - сотни байт. Для этого существует куча - менеджер кучи выделяет себе несколько страниц памяти и размечает эту область на блоки (свободные/занятые). При запросе HeapAlloc менеджер кучи ищет свободный блок и возвращает указатель на него (помечая как занятый, конечно).
А вызов VirtualAlloc с размером в сотню байт все равно закончится выделением одной страницы (4кб)

Что лучше? Если тебе нужно выделять память размером до 4кб то лучше использовать кучу. Если больше - выделять сразу страницами



Ранг: 12.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 мая 2008 00:09
· Личное сообщение · #15

VirtualAlloc также отрабатывает быстрее и выделяет память, выровненную по 64Kb (по крайней мере "обычно" ). Такой выровненный буфер обычно лучше для ввода-вывода (на WinCE так вообще для низкоуровнего IO единственно возможный ).



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 24 мая 2008 10:28 · Поправил: Freecod
· Личное сообщение · #16

А windows посылает сообщения при подключении новых устройств? Мне нужно "подхватывать" устройства (накопители естественно) в реальном времени. Пока кручу цикл GetLogicalDriveStrings(150, DrvList); GetDriveType(&DrvList[i]); , но тут сразу куча неудобств. Если диск уже добавлен (флешка например), её отключают, а потом подкл. другую - идём лесом =\ Нет способа отловить момент подключения нового диска и желательно его букву...




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 24 мая 2008 13:28
· Личное сообщение · #17

Посмотри, как сервис "Обнаружение оболочки оборудования" работает.

-----
invoke OpenFire




Ранг: 58.0 (постоянный), 13thx
Активность: 0.020.01
Статус: Участник

Создано: 25 мая 2008 08:26
· Личное сообщение · #18

Попробуй мониторить WM_SETTINGCHANGE.



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 27 мая 2008 09:18 · Поправил: Freecod
· Личное сообщение · #19

Хм. А можно мониторить сообщения без окна? Например у меня неконсольное приложение, но без окон. Хотелось бы отлавливать завершение системы.


<< . 1 . 2 .
 eXeL@B —› Программирование —› MapViewOfFile
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати