Как лучше работать с файлами больших объёмов?
От: erslgoeirjh Россия http://russianfellow.livejournal.com
Дата: 06.03.06 08:06
Оценка:
С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
Пу и Ме сидели на трубе...
Re: Как лучше работать с файлами больших объёмов?
От: rg45 СССР  
Дата: 06.03.06 08:28
Оценка:
Здравствуйте, erslgoeirjh, Вы писали:

E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?


CreateFile (WinAPI)
Эта функция предоставляет очень широкий сервис, с ее помощью можно сделать практически все.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Как лучше работать с файлами больших объёмов?
От: Сергей  
Дата: 06.03.06 08:28
Оценка:
Здравствуйте, erslgoeirjh, Вы писали:

E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?


Удобный и быстрый способ работы с большими (примерно до 2Гб) файлами — это проецирование файлов в память (Memory mapped files).
Удобно тем, что доступ к файлу выглядит так же, как и обращние к памяти. Благодаря этому для операций над содержимым файлов можно даже использовать те функции, которые для этого изначально не предназначались. Кэширование целиком возложено на ОС, что тоже хорошо в плане удобства и скорости.
Соответственно, средства WinAPI — это функции CreateFileMapping, MapVievOfFile.
Re: Как лучше работать с файлами больших объёмов?
От: Vovik1982 Россия  
Дата: 06.03.06 08:28
Оценка: 2 (1)
HANDLE hF = CreateFile(...);
ReadFile(hF, ...);
CloseHandle(hF);

Все реализации чтения из файла (STL, MFC и пр.) юзают Win32API.
Re: Как лучше работать с файлами больших объёмов?
От: michus Россия  
Дата: 06.03.06 08:36
Оценка:
Здравствуйте, erslgoeirjh, Вы писали:

E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?


В WinApi надо ориентироваться на функции с мапированными в память файлами (memory mapped files), такими, как CreateFileMapping, MapViewOfFile(Ex). Их противоположность (закрытие объектов): CloseHandle и UnmapViewOfFile соответственно. Этими функциями можно как читать, так и писать в файлы любого доступного файловой системе размера. Удобство заключается в том, что "смапировав" часть (максимальный размер зависит от ОС) файла в регион памяти, с этим регионом можно работать как с простым набором байтов.

В WinApi есть также функции ReadFile(Ex) и WriteFile(Ex) ими удобно дописывать файл (не надо вызывать SetFilePointer+SetEndOfFile), читать через ReadFile(Ex) менее удобно, чем через мапированный файл, т.к. использование этих функций предполагает наличия буферов для/с данными у вызывающей программы.

ЗЫ Для подробностей можно почитать Рихтера или MSDN.
Re[2]: Как лучше работать с файлами больших объёмов?
От: Сергей  
Дата: 06.03.06 08:43
Оценка: +1
Здравствуйте, michus, Вы писали:

>Этими функциями можно как читать, так и писать в файлы любого доступного файловой системе размера.


Насколько я знаю, размер успешно отображаемого файла зависит от доступного адресного пространства.
Re[3]: Как лучше работать с файлами больших объёмов?
От: Кодт Россия  
Дата: 06.03.06 09:10
Оценка:
> >Этими функциями можно как читать, так и писать в файлы любого доступного файловой системе размера.
>
> Насколько я знаю, размер успешно отображаемого файла зависит от доступного адресного пространства.

А ты не весь файл отображай, а только окно
Posted via RSDN NNTP Server 2.0
Перекуём баги на фичи!
Re: Как лучше работать с файлами больших объёмов?
От: vvotan Россия  
Дата: 06.03.06 09:28
Оценка:
Здравствуйте, erslgoeirjh, Вы писали:

E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?

Очень зависит от того, что именно предполагается с этим файлом делать. Если более-менее последовательная запись/чтение — async WriteFile\ReadFile. Если random access в относительно небольшой области — memmaps. Если "совсем" random acess — то лучше всего ReadFile/WriteFile со своей буферизацией.
Это по скорости.

Если главное — удобство — наверное лучше всего memmaps.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.