Сейчас на форуме: 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;}
}


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

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



Ранг: 110.7 (ветеран)
Активность: 0.070
Статус: Участник
~ tPORt ~

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

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



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

Создано: 22 мая 2008 12:04 · Поправил: sss
· Личное сообщение · #3

А если попробовать указать в CreateFileMapping параметр dwMaximumSizeLow = 1024 * 1024 * 1024, то разве размер "окна" не будет ограничен мегабайтом ?



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

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

sss пишет:
А если попробовать указать dwMaximumSizeLow = 1024 * 1024 * 1024, то разве размер "окна" не будет ограничен мегабайтом ?

CrFileMapp. в случае hfMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1024 * 1024 * 1024, NULL); возвращает NULL...



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

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

Циклический буфер пока никто не отменял.
Делается обычный буфер в памяти, размером 2х-3х больше "искомых данных в файле".
Читается изначально читается весь буфер, поиск идет до "конца первого куска" с безопасным оверлапом.
Потом память мувится и один из кусков замещается новым из файла. Накладные расходы на чтение с диска значительно выше, чем на грамотно написанный MoveMemory



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

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

Да, и еще: CreateFileMapping не отменяет подъем данных с диска и тем самым - те же накладные расходы на чтение.
Все прелесть циклического буфера (особенно 3х) заключается в возможности выполнять операции полностью асинхронно: несколько Мб фала зачастую подымаются дольше, чем параллельно инфа обрабатывается .

Схема где-то такая:
изначально подымаются 2 куска из 3х (синхронно), третий сшедулится асинхронно (через "оверлапд"), обрабатываются первый кусок (залезая отчасти во второй), дожидаемся завершения асинхронного чтения, мовим буфер (перемещая 2,3 в 1,2), продолжаем обрабатывать 2й кусок (который стал первым) пердварительно зашедулив асинхронное чтение нового 3го куска. и т.д.
Просадка скорости может быть только на:
1) Если обработка данных выполняется медленнее чем чтение (тогда суммарная скорость получается скорость обработки+время на мов памяти)
2) Если чтение диска таки медленние (что бывает в 90% случаев) - тогда скорость диска + время на мов памяти.

Второе слагаемое незначительное по сравнении с первым и на athlon x64 3200 + и RAID0 2x составляет около 3-5% от общего времени (это тестилось).



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

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

И не забудь, что читать надо данные по 64 кб,т.к. именно такой размер обеспечивает максимальную быстроту работы с файлами при чтении/записи. (в XP, про висту не знаю)

-----
Само плывет в pуки только то, что не тонет.




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

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

кратно
Если речь идет именно о больших файлах, вряд ли 64x16 причитается быстрее, чем 1024x1.


А соптимайзить (если чтение таки медленнее обработки) на 3х буфере можно еще перемещзением 2->1 _перед_ завершением асинхронного чтения, потом уж 3->2



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

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

а в общем, лучше размер буфера сделать переменной или задефайнить и погонять на практике, при каком будет лучше (с разными размерами входных файлов). логично предположить, что это будет 64кб+




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

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

Как раз недавно проводил эксперимент по размеру буфера-скорости записи

Синхронная запись файла размером 20mb с изменением размера блока от 256b до 20mb:
buffer_size - 256 time is 141.249 ms
buffer_size - 512 time is 84.7206 ms
buffer_size - 1024 time is 54.3948 ms
buffer_size - 2048 time is 41.332 ms
buffer_size - 4096 time is 34.5539 ms
buffer_size - 8192 time is 28.0534 ms
buffer_size - 16384 time is 24.431 ms
buffer_size - 32768 time is 23.0809 ms
buffer_size - 65536 time is 23.378 ms
buffer_size - 131072 time is 22.1039 ms
buffer_size - 262144 time is 22.1926 ms
buffer_size - 524288 time is 142.334 ms
buffer_size - 1048576 time is 340.674 ms
buffer_size - 2097152 time is 332.983 ms
buffer_size - 4194304 time is 312.782 ms
buffer_size - 8388608 time is 378.822 ms
buffer_size - 16777216 time is 308.668 ms
buffer_size - 20971520 time is 225.883 ms

Чтение не тестил, но врядле картинка изменится.
ЗЫ: время не на запись блока, а на запись всех 20мбайт по кускам с такими буферами.

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




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

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

Freecod пишет:
GENERIC_READ || GENERIC_WRITE

Путаете битовое и логическое



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

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

Rascal пишет:

Как раз недавно проводил эксперимент по размеру буфера-скорости записи


Результат мягко говоря странный (256Kb<->512Kb). Что было запущено в процессе? Это один проход или "среднее"? Фрагментация ФС? Что за ФС?




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

Создано: 22 мая 2008 14:56
· Личное сообщение · #13

ashghost пишет:
Что было запущено в процессе?

? в каком процессе? Что запущено?

ashghost пишет:
Это один проход или "среднее"

Среднее. Проводил тесты с разными файлами на разных логических разделах разных размером. Это пороговое место везде подтверждалось. На флешке например такой результат:

Синхронная запись файла размером 2mb с изменением размера блока от 256b до 2mb на флеш:

buffer_size - 256 time is 8.46768 ms
buffer_size - 512 time is 24.1406 ms
buffer_size - 1024 time is 22.7433 ms
buffer_size - 2048 time is 15.1558 ms
buffer_size - 4096 time is 2634.57 ms
buffer_size - 8192 time is 1550.96 ms
buffer_size - 16384 time is 1023.72 ms
buffer_size - 32768 time is 747.101 ms
buffer_size - 65536 time is 668.474 ms
buffer_size - 131072 time is 539.104 ms
buffer_size - 262144 time is 959.713 ms
buffer_size - 524288 time is 902.685 ms
buffer_size - 1048576 time is 815.984 ms
buffer_size - 2097152 time is 453.228 ms


ashghost пишет:
Фрагментация ФС? Что за ФС?

Фрагментация врядл, ибо проводился эксперимент не раз. Создавался файл, замтем удалялся, опять создавался итп. Размер файла один. Раздел практически чист. ФС - ntfs. Для флешки соотв. Код вроде как в норме. Могу выложить.

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





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

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

Вот собсно ехе с батником. чтоб узнать чо какой параметр значит - запускаем без батника.

c49e_22.05.2008_CRACKLAB.rU.tgz - Release.rar

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




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

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


? в каком процессе? Что запущено?


Некорректно выразился: "во время тестирования".
К примеру антивирь мог файлы трогать (или сканить параллельно) и т.д.


buffer_size - 131072 time is 539.104 ms
buffer_size - 262144 time is 959.713 ms
buffer_size - 524288 time is 902.685 ms


Легче (таки не в 7 раз ); похоже на то, что нужно.


buffer_size - 2097152 time is 453.228 ms
а вот эта часть интересна. посему и рекомендовал "погонять".

Фрагментация врядл, ибо проводился эксперимент не раз. Создавался файл, замтем удалялся, опять создавался итп. Размер файла один. Раздел практически чист. ФС - ntfs.
ОК.

Для флешки соотв.
Флешки??


Код вроде как в норме. Могу выложить.
Если в коде простой цикл, смысла думаю нет.




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

Создано: 22 мая 2008 15:43 · Поправил: Rascal
· Личное сообщение · #16

ashghost пишет:
buffer_size - 131072 time is 539.104 ms
buffer_size - 262144 time is 959.713 ms
buffer_size - 524288 time is 902.685 ms

Легче (таки не в 7 раз ); похоже на то, что нужно.


=)

Rascal пишет:
buffer_size - 2048 time is 15.1558 ms
buffer_size - 4096 time is 2634.57 ms

;)

[ADDED]
для сигейта 200гб скачок находится тут. это для 10мб файла. ваще чем больше файл, тем меньше влияет размер буфера на скорость. на моих винчах. в идеале если делать софт с ручной подкачкой данных - нада проводить в программе тест записи блоков, и использовать оттуда величину буфера.

buffer_size - 262144 time is 8.51633 ms
buffer_size - 524288 time is 329.003 ms
buffer_size - 10485760 time is 998.373 ms


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




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

Создано: 22 мая 2008 15:55 · Поправил: Freecod
· Личное сообщение · #17

Ну интересно что после мэппинга опер. память не занимается сразу во весь размер файла, а только с "оборотами" while.
Если выбирать, то готов уступить скорость оптимизации памяти - так что что там с "окном" у CreateFileMapping? CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1024, NULL); - следующие 1024 байта придыдущие не освобождают как я понял, выпадаем в исключение =(.
Циклический буфер прикручивать к готовому уже коду - куча проблем, мне бы спихнуть всё это на систему и встр. функции, для "себя" представляя это одной большой кучей байт...



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

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

asmfan пишет:
Freecod пишет:
GENERIC_READ || GENERIC_WRITE
Путаете битовое и логическое

Епть, только сейчас заметил. Драл код из своего исходника на асме =)



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

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

[...]



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

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

>>Ну интересно что после мэппинга опер. память не занимается сразу во весь размер файла, а только с "оборотами" while.

На самом деле можешь не париться по этому поводу, в винде механизм управления памятью весьма гибкий.
Страницы считываются в оперативную память (отнимая свободную часть последней) по мере обращения, мало того, если другому процессу вдруг потребуется память и в системе будет мало свободных страниц, твои страницы нагло заберут - если они были модифицированы, их скинут на диск и отнимут в пользу другого процесса, в противном случае просто отнимут в пользу другого процесса.
Когда ты в следующий раз обратишься к ним, будет ошибка страницы и данные снова загрузят из файла в память. Так что никакого перерасхода памяти я не вижу - если памяти достаточно свободной, тогда страницы будут у тебя почти всегда, если мало - у тебя будут их периодически отнимать, но для тебя все равно все будет прозрачно. Так же, Windows периодически усекает рабочие наборы процессов (например бездействующий процесс практически не будет занимать ОЗУ в конце концов - большая часть выгружаемых страниц будет освобождена и переведена в список свободных. Если что - их снова прочитают из файла подкачки или проецируемого файла (зависит от их природы)).



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

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

Мешает сам факт помещения большого объёма данных в память - начинает выгружать "неиспользуемые библиотеки", как следствие тормоза, итп.



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

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

Freecod пишет:
Мешает сам факт помещения большого объёма данных в память - начинает выгружать "неиспользуемые библиотеки", как следствие тормоза, итп.


Не хочешь чтоб памяти много занималось, не юзай MapViewOfFile (данные подгружай и выгружай когда надо)

2 Great: сам бы лучше не написал =)



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

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

>>2 Great: сам бы лучше не написал =)

в плане, не понял? ))

>> Мешает сам факт помещения большого объёма данных в память - начинает выгружать "неиспользуемые библиотеки", как следствие тормоза, итп.
а зачем ты проецируешь весь файл?
можно маппинг делать на весь файл (CreateFileMappingA/W), а виды делать по кусочкам (MapViewOfFile[Ex])



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

Создано: 22 мая 2008 17:18 · Поправил: SL7549
· Личное сообщение · #24

Great пишет:
>>2 Great: сам бы лучше не написал =)

в плане, не понял? ))


хорошо написал, хвалю
_________________________________

можно что-то наподобие своего менеджера памяти замутить, но это фигня какая-то =)



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

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

я даже не понял это сарказм или действительно похвала))
зы. у меня и статья на тему памяти есть.. на васме можно найти в top50 в первой десятке.

>> можно что-то наподобие своего менеджера памяти замутить, но это фигня какая-то =)
затрахаешься) хотя.. я щас пишу менеджер памяти для своей ОС, как раз маппинг реализовываю



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

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

Great пишет:
я даже не понял это сарказм или действительно похвала))

это похвала

Great пишет:
затрахаешься) хотя.. я щас пишу менеджер памяти для своей ОС, как раз маппинг реализовываю

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



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

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

Great пишет:
можно маппинг делать на весь файл (CreateFileMappingA/W), а виды делать по кусочкам (MapViewOfFile[Ex])

Т.е. поработали с этим "кусочком", потом снова MapViewOfFile, следующий кусочек, итп... Так? Или он сам будет окошко на кусочки двигать? :с надеждой: =)
Т.е. будет как тот же самый ReadFile по, скажем, метру в буфер какой-нибудь?

Ещё вопрос: программа должна искать невнапряг пользователю, даже когда простаивает не отъедать больше 3-5% процессора. SetPriorityClass - LOW не помогает...



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

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

Freecod пишет:
даже когда простаивает не отъедать больше 3-5% процессора

програмить под виндой учись =)

Freecod пишет:
поработали с этим "кусочком", потом снова MapViewOfFile, следующий кусочек, итп...

тогда легче ReadFile юзать



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

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

SL7549 пишет:
Freecod пишет:
даже когда простаивает не отъедать больше 3-5% процессора
програмить под виндой учись =)

И всё таки? Ждать? Этож извращение...



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

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

какая хоть программа? консольная или оконная?


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


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