Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
6-96936
NewGuest
2002-12-06 19:33
2003.01.30
Мастера, раз в D7 не установлены компаненты типа TclientSocket,то


1-96819
Олег Лаукарт
2003-01-20 15:22
2003.01.30
Event для TCollectionItem


1-96873
softmaster
2003-01-21 12:16
2003.01.30
Проблема с OLE.


1-96784
VinRaider
2003-01-16 23:37
2003.01.30
Изменение цвета Label или StaticText


1-96645
Сатир
2003-01-19 20:25
2003.01.30
Как рисовать по картинке?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский