Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Кто работал с 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
14-96992
если_увидят_голову_скрутят
2003-01-11 15:38
2003.01.30
Неужели на мафию никакой управы нет?


6-96925
Свой
2002-12-03 19:21
2003.01.30
ras и телефоны


1-96833
Дмитрий Минеев
2003-01-20 23:10
2003.01.30
СкроллБар в компоненте


1-96800
Pk
2003-01-20 12:52
2003.01.30
Одинаковые события форм


1-96827
Smok_er
2003-01-19 17:19
2003.01.30
Программное нажатие комбинации клавиш...