![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кто работал с File Mapping, нужен совет [D6, Win2k]
Андрусь © (2003-01-20 13:47:00)Привет всем!Такой вопрос:мне нужно из файла декодировать инф.Для этого её по сути нажно читать побайтно и обрабатывать.Размер порядка 15-20 М.Читаю при помощи TFileStream. Отрабатывает за 1-1.5 минут.Много.Посоветовали сделать ч/з File Mapping - с виду несложно. Получу ли я существенной прибавки к скорости и каким гемороем при этом обзаведусь.Зараннее всем большое спасибо.
Игорь Шевченко (2003-01-20 18:10:00) [1]han_malign © (20.01.03 17:55)
И попадает под действие "non-disclosure license agreement" :-)))
han_malign (2003-01-20 17:55:00) [2]http://www.bugtraq.ru/rsn/archive/2003/01/09.html
Игорь Шевченко (2003-01-20 17:31:00) [3]
> Короче, пока утечки исходников Windows(буквально на днях
> предоставлены Microsoft-ом - ФАПСИ) не будет
А поподробнее ? :-)))
han_malign (2003-01-20 17:28:00) [4]> hint: Windows сама, в хвост и в гриву использует FileMapping для чтения файлов (что для меня было удивительно) и отнюдь не для разделения памяти промеж процессами
- ну дак само-собой... Скорее всего это универсальный шлюз виртуальной памяти, если вспомнить набивший оскомину тезис Страуструпа о "повторном использовании кода", то вполне обоснованно делать весь ввод/вывод через "одно место"(тем более что VMM вряд ли использует IOCTL и IRP-ы).
Короче, пока утечки исходников Windows(буквально на днях предоставлены Microsoft-ом - ФАПСИ) не будет, точно не ничего скажешь - твори, выдумывай, пробуй... :))))
З.Ы. Буквально сегодня выяснил что MS приложения, под 98SE, с флажком System Properties->Performance->Virtual Memory->Disable virtual memory - принципиально не работают, хотя памяти до ж...
gsu (2003-01-20 17:22:00) [5]>> Rooman ©
значит задача не критична
Rooman (2003-01-20 17:16:00) [6]пробовал буферы, пробовал файлмапинг - одинаково быстро работает. особой разницы незаметно.
Игорь Шевченко (2003-01-20 17:06:00) [7]Anatoly Podgoretsky © (20.01.03 17:00)
Угу. Это еще и ответ на вопрос: "Почему у меня прога в Таск Менеджере столько памяти жрет" :-)
С уважением,
Anatoly Podgoretsky (2003-01-20 17:00:00) [8]Игорь Шевченко © (20.01.03 16:57)
И SWAP частично так органихован, большая его часть это мапирование на исполнимый файл.
Игорь Шевченко (2003-01-20 16:57:00) [9]han_malign © (20.01.03 16:52)
> File Mapping предназначен в первую очередь для разделения
> памяти между процессами,
При всем моем уважении к тебе, согласиться не могу :-)
Рихтера бы почитать, особливо 3-е издание.
Под рукой нету, процитировать, к сожалению, не смогу.
hint: Windows сама, в хвост и в гриву использует FileMapping для чтения файлов (что для меня было удивительно) и отнюдь не для разделения памяти промеж процессами.
С уважением,
han_malign (2003-01-20 16:52:00) [10]>Игорь Шевченко © (20.01.03 16:04)
> Где такая трава растет ?
- там же где рекомендуется использовать в одном процессе не мутант а критическую секцию. File Mapping предназначен в первую очередь для разделения памяти между процессами, поэтому лишних проверок при обращении(конкретно один раз при MapViewOfFile :))) ) не избежать даже при эксклюзивном неименованном использовании, но задержки будут настолько микроскопические, что вряд-ли их какой профилер отловит...
> 15-20 M да,но всё могёт быть,поэтому читать в мозги всё не катит.
- а куда по твоему MapViewOfFile проецирует данные??? Правильный ответ - в адресное пространство вызывающего процесса, так что ограничения по памяти те-же самые...
З.Ы. Хотя, в принципе, в случае FileMaping, работа с файлом ведется напрямую через VMM, без промежуточной буферизации, но через CreateFile/ReadFile это тоже прекрасно делается (dwFlagsAndAttributes: FILE_FLAG_NO_BUFFERING, FILE_FLAG_SEQUENTIAL_SCAN).
rea (2003-01-20 16:28:00) [11]Ошибся. Я использовал TStringList.SaveToFile, который использовал TFileStream, который использовал API WriteFile кажется. Ограничение на запись порядка 10Mb (точнее не выяснял).
gsu (2003-01-20 16:20:00) [12]и у мя не было, причем и поболе 10 метров считывал !
MBo (2003-01-20 16:15:00) [13]>Кстати есть ограничение на чтение одного блока данных API функциями - мегабайт 10 кажется
Читал много, ограничений не было
gsu (2003-01-20 16:13:00) [14]mapping должен быть быстрей, если с памятью о"кей (-:|~
REA (2003-01-20 16:12:00) [15]Кстати есть ограничение на чтение одного блока данных API функциями - мегабайт 10 кажется или что-то в этом роде. Я однажды напоролся - хотел одним куском файл в память зачитать.
Андрусь (2003-01-20 16:07:00) [16]>han_malign
15-20 M да,но всё могёт быть,поэтому читать в мозги всё не катит.
Пока более склонен к мнению MBo про 4KByte*N.
Хотя кажется,что всё-таки ч/з File Mapping побыстрее будет.
Игорь Шевченко © (20.01.03 15:30) не слышно вашего авторитетного мнения.
Мне всё-таки нужен совет.
Игорь Шевченко (2003-01-20 16:04:00) [17]han_malign © (20.01.03 15:42)
> только прибавятся тормоза (микроскопические правда) из-за
> использования системного пространтсва имен
Где такая трава растет ?
han_malign (2003-01-20 15:42:00) [18]Нифига путного из этого не получится, только прибавятся тормоза (микроскопические правда) из-за использования системного пространтсва имен, а в буффер ручками (BlockRead, ReadFile) подкачивать, не сложнее чем MapViewOfFile(Ex) делать. Все равно чтение через то же место делается.
З.Ы. А 15-20 Мб вполне можно целиком в память закачивать, если скорость критична, то лишние 256Мб на машину поставить не проблема.
З.З.Ы. Возможно закачку и обработку в двух потоках делать надо (асинхронно через Overlapped, если под NT), через двойной буфер(или половинки FIFO по другому).
З.З.З.Ы. В TFileStream никакой оптимизации чтения не делается. И вообще он актуален только для работы с наследниками TPersistent, TReader, TWriter, во всех остальных случаях это стрельба из пушки по воробьям(особенно при побайтовом чтении).
function THandleStream.Read(var Buffer; Count: Longint): Longint;
begin
Result := FileRead(FHandle, Buffer, Count);
if Result = -1 then Result := 0;
end;
function THandleStream.Write(const Buffer; Count: Longint): Longint;
begin
Result := FileWrite(FHandle, Buffer, Count);
if Result = -1 then Result := 0;
end;
Игорь Шевченко (2003-01-20 15:30:00) [19]Паша © (20.01.03 15:17)
Никуда не загружается.
По мере надобности его страницы помещаются в ОЗУ. В файл подкачки он никаким боком.
Одного не понимаю, зачем открывать файл на Read+Write, а Mapping делать Readonly ?
Паша (2003-01-20 15:17:00) [20]Smithson © (20.01.03 14:35)
Зачем API? Работать придется с массивом байт!
Игорь Шевченко ©
Тут вопросик. Если я делаю так
var
Ptr: Pointer;
hFile, hMapping: THandle;
begin
hFile := FileOpen(ff, fmOpenReadWrite+ fmShareDenyNone);
hMapping := CreateFileMapping( hFile, nil, PAGE_READWRITE, 0, 0, nil);
Ptr := MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
.....
то куда реально загружается файл- в файл подкачки Винды или в ОЗУ, или как у Винды карта ляжет?