Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизКто работал с File Mapping, нужен совет Найти похожие ветки
← →
Андрусь (2003-01-20 13:47) [0]Привет всем!Такой вопрос:мне нужно из файла декодировать инф.Для этого её по сути нажно читать побайтно и обрабатывать.Размер порядка 15-20 М.Читаю при помощи TFileStream. Отрабатывает за 1-1.5 минут.Много.Посоветовали сделать ч/з File Mapping - с виду несложно. Получу ли я существенной прибавки к скорости и каким гемороем при этом обзаведусь.Зараннее всем большое спасибо.
← →
MBo (2003-01-20 13:58) [1]Прибавку получить можешь, но, вероятно, дело замедляется в основном тем, сколько данных читаешь за один раз.
И с использованием TFileStream можно ускориться, если читать не побайтно, а сразу достаточно большой буфер в память - лучше 4KByte*N
← →
Андрусь (2003-01-20 14:03) [2]Я понимаю,насчёт буфера. Как раз в том и вопрос,по какому пути пойти.До этого времени скорость работы не была важна: отрабатывался алгоритм декодирования.
← →
Smithson (2003-01-20 14:35) [3]Из геммороя (если я ошибаюсь, поправьте меня) будет то, что стандартные delphi операции с файлами не пойдут с mapped file. Придется работать на API. А так - что там весь файл считывается в память, что здесь - един фиг.
← →
Игорь Шевченко (2003-01-20 14:55) [4]
> Придется работать на API
С памятью :-)))
← →
Smithson (2003-01-20 15:13) [5]Это-то да, но я имел в виду, что у человека уже написан некий код с доступом к файлу через TFileStream и что не удасться его легко переделать на доступ к ... памяти.
← →
Паша (2003-01-20 15:17) [6]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);
.....
то куда реально загружается файл- в файл подкачки Винды или в ОЗУ, или как у Винды карта ляжет?
← →
Игорь Шевченко (2003-01-20 15:30) [7]Паша © (20.01.03 15:17)
Никуда не загружается.
По мере надобности его страницы помещаются в ОЗУ. В файл подкачки он никаким боком.
Одного не понимаю, зачем открывать файл на Read+Write, а Mapping делать Readonly ?
← →
han_malign (2003-01-20 15:42) [8]Нифига путного из этого не получится, только прибавятся тормоза (микроскопические правда) из-за использования системного пространтсва имен, а в буффер ручками (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 16:04) [9]han_malign © (20.01.03 15:42)
> только прибавятся тормоза (микроскопические правда) из-за
> использования системного пространтсва имен
Где такая трава растет ?
← →
Андрусь (2003-01-20 16:07) [10]>han_malign
15-20 M да,но всё могёт быть,поэтому читать в мозги всё не катит.
Пока более склонен к мнению MBo про 4KByte*N.
Хотя кажется,что всё-таки ч/з File Mapping побыстрее будет.
Игорь Шевченко © (20.01.03 15:30) не слышно вашего авторитетного мнения.
Мне всё-таки нужен совет.
← →
REA (2003-01-20 16:12) [11]Кстати есть ограничение на чтение одного блока данных API функциями - мегабайт 10 кажется или что-то в этом роде. Я однажды напоролся - хотел одним куском файл в память зачитать.
← →
gsu (2003-01-20 16:13) [12]mapping должен быть быстрей, если с памятью о"кей (-:|~
← →
MBo (2003-01-20 16:15) [13]>Кстати есть ограничение на чтение одного блока данных API функциями - мегабайт 10 кажется
Читал много, ограничений не было
← →
gsu (2003-01-20 16:20) [14]и у мя не было, причем и поболе 10 метров считывал !
← →
rea (2003-01-20 16:28) [15]Ошибся. Я использовал TStringList.SaveToFile, который использовал TFileStream, который использовал API WriteFile кажется. Ограничение на запись порядка 10Mb (точнее не выяснял).
← →
han_malign (2003-01-20 16:52) [16]>Игорь Шевченко © (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).
← →
Игорь Шевченко (2003-01-20 16:57) [17]han_malign © (20.01.03 16:52)
> File Mapping предназначен в первую очередь для разделения
> памяти между процессами,
При всем моем уважении к тебе, согласиться не могу :-)
Рихтера бы почитать, особливо 3-е издание.
Под рукой нету, процитировать, к сожалению, не смогу.
hint: Windows сама, в хвост и в гриву использует FileMapping для чтения файлов (что для меня было удивительно) и отнюдь не для разделения памяти промеж процессами.
С уважением,
← →
Anatoly Podgoretsky (2003-01-20 17:00) [18]Игорь Шевченко © (20.01.03 16:57)
И SWAP частично так органихован, большая его часть это мапирование на исполнимый файл.
← →
Игорь Шевченко (2003-01-20 17:06) [19]Anatoly Podgoretsky © (20.01.03 17:00)
Угу. Это еще и ответ на вопрос: "Почему у меня прога в Таск Менеджере столько памяти жрет" :-)
С уважением,
← →
Rooman (2003-01-20 17:16) [20]пробовал буферы, пробовал файлмапинг - одинаково быстро работает. особой разницы незаметно.
← →
gsu (2003-01-20 17:22) [21]>> Rooman ©
значит задача не критична
← →
han_malign (2003-01-20 17:28) [22]> hint: Windows сама, в хвост и в гриву использует FileMapping для чтения файлов (что для меня было удивительно) и отнюдь не для разделения памяти промеж процессами
- ну дак само-собой... Скорее всего это универсальный шлюз виртуальной памяти, если вспомнить набивший оскомину тезис Страуструпа о "повторном использовании кода", то вполне обоснованно делать весь ввод/вывод через "одно место"(тем более что VMM вряд ли использует IOCTL и IRP-ы).
Короче, пока утечки исходников Windows(буквально на днях предоставлены Microsoft-ом - ФАПСИ) не будет, точно не ничего скажешь - твори, выдумывай, пробуй... :))))
З.Ы. Буквально сегодня выяснил что MS приложения, под 98SE, с флажком System Properties->Performance->Virtual Memory->Disable virtual memory - принципиально не работают, хотя памяти до ж...
← →
Игорь Шевченко (2003-01-20 17:31) [23]
> Короче, пока утечки исходников Windows(буквально на днях
> предоставлены Microsoft-ом - ФАПСИ) не будет
А поподробнее ? :-)))
← →
han_malign (2003-01-20 17:55) [24]http://www.bugtraq.ru/rsn/archive/2003/01/09.html
← →
Игорь Шевченко (2003-01-20 18:10) [25]han_malign © (20.01.03 17:55)
И попадает под действие "non-disclosure license agreement" :-)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.012 c