![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Cybernetic10 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
Если я буду работать с большими файлами, то открывать их сразу и полностью в оперативку нецелесообразно. Жрет и память, и время.
Как и какими средствами в оперативную память загружать файл кусками? Слышал, что такой механизм значительно может повысить работу программы с большими файлами. |
|||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Совершенно верно, только не открывать - а загружать
Теми же средствами которыми загружаете полностью.
Значительно может повысить использование MapViewOfFile Это сообщение отредактировал(а) azesmcar - 25.5.2009, 12:49 |
||||||
|
|||||||
| Cybernetic10 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
А как? Если я для чтения файла создаю поток командой ifstream, процессор же полностью грузит его в ОП? И какими же средствами можно разбить файлы на части? |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
нет, не грузит.
не надо его разбивать..просто читайте в цикле. Это сообщение отредактировал(а) azesmcar - 25.5.2009, 14:30 |
||||
|
|||||
| Cybernetic10 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
О как
То есть этот кусок кода...
...будет по одному символу загружать в память? А по скорости эти два кода равносильны? Или твой все-таки быстрее за счет малого обращения к потоку? Это сообщение отредактировал(а) Cybernetic10 - 25.5.2009, 14:36 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Cybernetic10
нет, чем куски больше - тем быстрее выйдет, но...памяти будет жрать больше. Если файл большой - имеет смысл использовать АПИ функцию MapViewOfFile - это под виндоуз. Под линукс - mmap если правильно помню. Добавлено @ 14:39
да Это сообщение отредактировал(а) azesmcar - 25.5.2009, 14:39 |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
На самом деле, конечно, стандартные классы ввода-вывода в C++ (да и функции stdio в Си) буферизуют доступ к файлу и по одному символу файл читаться не будет. Будут загружаться по мере необходимости куски не слишком большого размера. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Cybernetic10 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
Тогда скажите, стоит ли прибегать к ручной буферизации, как советовал azesmcar? Или из этого большой выгоды не сделаешь, пусть операции сами буферизуют? Речь идет о файлах порядка 10-50 МБ. И если для достижения быстродействия вы будите советовать MapViewOfFile, можно схематичный пример? В MSDN не разобрался. Там что-то о многопроцессности... Мне это пока не нужно |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Cybernetic10
Это внутренняя реализация, нас она особо интересовать не должна. Эти куски очень небольшие, в вашем случае нужны побольше. Void Стримы буфферизацию делать вроде бы не обязаны. Эти не запрещено стандартом (ибо нигде не сказано что если юзер потребовал байт, внутренняя реализация обязана прочитать именно один байт), но стандарт и не обязует буфферизировать данные. Но на практике наверняка многие реализации так и работают. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Как посмотреть. Семантика basic_streambuf и basic_filebuf подробно расписана в стандарте. Не знаю, можно ли представить удовлетворяющую стандарту реализацию, в которой они всегда пропускают ввод-вывод напрямую. Но это к топику уже не относится, да. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Cybernetic10 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
Я воспользуюсь этим методом. Остался один деликатный момент Мы достигли конца файла. Чем программа будет забивать конец массива buffer, когда файл уже кончится, а массив еще нет? Я запсутил тестовый вариант, там число -52 и соответствующий символ 'M'. Всегда ли там будет отрицательное число, и может ли это служить критерием раннего окончания массива? |
||||
|
|||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
По моему input.read возвращает количество прочитанных байт -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Честно сказать, по нынешним временам, это ерундовый объем. Тормозить на нем при чтении - это нужно постараться написать... В зависимости от задачи, можно и просто в память все зачитать (или замэпить)... или читать буферами, через стандартные потоки, действительно... Не заморачивался бы, пока реально не наступили проблемы с быстродействием... -------------------- ... |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Cybernetic10
http://www.cplusplus.com/reference/iostream/istream/read/ а вообще Earnest права - это не так уж много..лучше читать сразу в память, тем более это временно, после обработки память освободится (если я правильно понял). |
|||
|
||||
| Cybernetic10 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 5.5.2009 Репутация: нет Всего: нет |
Как оказалось, это не так.
Если кому интересно, вот ссылка на источник: http://users.msu.dubna.ru/~ovg/c++course/p2-8.html Более полного руководства по потокам в С++ на русском языке я пока не видел. Хотя, не очень то сильно и искал |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |