Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Постраничное считывание файла, Как? 
:(
    Опции темы
Cybernetic10
Дата 25.5.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Если я буду работать с большими файлами, то открывать их сразу и полностью в оперативку нецелесообразно. Жрет и память, и время.
Как и какими средствами в оперативную память загружать файл кусками? Слышал, что такой механизм значительно может повысить работу программы с большими файлами. smile
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 12:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Cybernetic10 @  25.5.2009,  12:27 Найти цитируемый пост)
Если я буду работать с большими файлами, то открывать их сразу и полностью в оперативку нецелесообразно

Совершенно верно, только не открывать - а загружать

Цитата(Cybernetic10 @  25.5.2009,  12:27 Найти цитируемый пост)
Как и какими средствами в оперативную память загружать файл кусками? 

Теми же средствами которыми загружаете полностью.

Цитата(Cybernetic10 @  25.5.2009,  12:27 Найти цитируемый пост)
Слышал, что такой механизм значительно может повысить работу программы с большими файлами. smile 

Значительно может повысить использование MapViewOfFile

Это сообщение отредактировал(а) azesmcar - 25.5.2009, 12:49
PM   Вверх
Cybernetic10
Дата 25.5.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  25.5.2009,  12:46 Найти цитируемый пост)
Как и какими средствами в оперативную память загружать файл кусками? 

Теми же средствами которыми загружаете полностью.


А как? Если я для чтения файла создаю поток командой ifstream, процессор же полностью грузит его в ОП? И какими же средствами можно разбить файлы на части?




PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 14:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Cybernetic10 @  25.5.2009,  14:24 Найти цитируемый пост)
Если я для чтения файла создаю поток командой ifstream, процессор же полностью грузит его в ОП?

нет, не грузит.
Код

std::ifstream input("путь_к_моему_большому_файлу");
char buffer[1024];
input.read(buffer, 1024); //вот тут грузит 1024 байта


Цитата(Cybernetic10 @  25.5.2009,  14:24 Найти цитируемый пост)
И какими же средствами можно разбить файлы на части?

не надо его разбивать..просто читайте в цикле.


Это сообщение отредактировал(а) azesmcar - 25.5.2009, 14:30
PM   Вверх
Cybernetic10
Дата 25.5.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



О как smile Не знал))
То есть этот кусок кода...
Код

std::ifstream input("путь_к_моему_большому_файлу");
for (int i = 0; i < 1024; i++)
{
char c;
input >> c; // c = input.get();
...
}

...будет по одному символу загружать в память?

А по скорости эти два кода равносильны? Или твой все-таки быстрее за счет малого обращения к потоку?

Это сообщение отредактировал(а) Cybernetic10 - 25.5.2009, 14:36
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 14:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Cybernetic10

нет, чем куски больше - тем быстрее выйдет, но...памяти будет жрать больше. Если файл большой - имеет смысл использовать АПИ функцию MapViewOfFile - это под виндоуз. Под линукс - mmap если правильно помню.

Добавлено @ 14:39
Цитата(Cybernetic10 @  25.5.2009,  14:35 Найти цитируемый пост)
То есть этот кусок кода...
...будет по одному символу загружать в память?

да

Это сообщение отредактировал(а) azesmcar - 25.5.2009, 14:39
PM   Вверх
Void
Дата 25.5.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Cybernetic10 @  25.5.2009,  16:35 Найти цитируемый пост)
...будет по одному символу загружать в память?

На самом деле, конечно, стандартные классы ввода-вывода в C++ (да и функции stdio в Си) буферизуют доступ к файлу и по одному символу файл читаться не будет. Будут загружаться по мере необходимости куски не слишком большого размера.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cybernetic10
Дата 25.5.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(Void @  25.5.2009,  14:48 Найти цитируемый пост)
На самом деле, конечно, стандартные классы ввода-вывода в C++ (да и функции stdio в Си) буферизуют доступ к файлу и по одному символу файл читаться не будет. Будут загружаться по мере необходимости куски не слишком большого размера. 

Тогда скажите, стоит ли прибегать к ручной буферизации, как советовал azesmcar? Или из этого большой выгоды не сделаешь, пусть операции сами буферизуют?
Речь идет о файлах порядка 10-50 МБ.

И если для достижения быстродействия вы будите советовать MapViewOfFile, можно схематичный пример? В MSDN не разобрался. Там что-то о многопроцессности... Мне это пока не нужно smile
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Cybernetic10

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

Void
Стримы буфферизацию делать вроде бы не обязаны. Эти не запрещено стандартом (ибо нигде не сказано что если юзер потребовал байт, внутренняя реализация обязана прочитать именно один байт), но стандарт и не обязует буфферизировать данные. Но на практике наверняка многие реализации так и работают.

PM   Вверх
Void
Дата 25.5.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(azesmcar @  25.5.2009,  17:08 Найти цитируемый пост)
стандарт и не обязует буфферизировать данные.

Как посмотреть. Семантика basic_streambuf и basic_filebuf подробно расписана в стандарте. Не знаю, можно ли представить удовлетворяющую стандарту реализацию, в которой они всегда пропускают ввод-вывод напрямую. Но это к топику уже не относится, да.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Cybernetic10
Дата 25.5.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  25.5.2009,  14:27 Найти цитируемый пост)
Код

std::ifstream input("путь_к_моему_большому_файлу");
char buffer[1024];
input.read(buffer, 1024); //вот тут грузит 1024 байта


Я воспользуюсь этим методом. Остался один деликатный момент smile
Мы достигли конца файла. Чем программа будет забивать конец массива buffer, когда файл уже кончится, а массив еще нет? Я запсутил тестовый вариант, там число -52 и соответствующий символ 'M'. Всегда ли там будет отрицательное число, и может ли это служить критерием раннего окончания массива?
PM MAIL   Вверх
Andrey44
Дата 25.5.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(Cybernetic10 @  25.5.2009,  15:39 Найти цитируемый пост)
когда файл уже кончится, а массив еще нет?

Цитата(Cybernetic10 @  25.5.2009,  15:39 Найти цитируемый пост)
input.read(buffer, 1024); //вот тут грузит 1024 байта

По моему input.read возвращает количество прочитанных байт




--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 25.5.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Cybernetic10 @  25.5.2009,  16:01 Найти цитируемый пост)
Речь идет о файлах порядка 10-50 МБ.

Честно сказать, по нынешним временам, это ерундовый объем. Тормозить на нем при чтении - это нужно постараться написать... В зависимости от задачи, можно и просто в память все зачитать (или замэпить)... или читать буферами, через стандартные потоки, действительно... 
Не заморачивался бы, пока реально не наступили проблемы с быстродействием...


--------------------
...
PM   Вверх
azesmcar
Дата 25.5.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Cybernetic10

http://www.cplusplus.com/reference/iostream/istream/read/
а вообще Earnest права - это не так уж много..лучше читать сразу в память, тем более это временно, после обработки память освободится (если я правильно понял).
PM   Вверх
Cybernetic10
Дата 29.5.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Цитата(Andrey44 @  25.5.2009,  15:43 Найти цитируемый пост)
По моему input.read возвращает количество прочитанных байт

Как оказалось, это не так.
Цитата
Если же вы хотите просто считать в буфер определенное количество символов, не разбираясь, есть ли там переводы строк или нет, то следует воспольоваться функцией read(), а затем с помощью другой функции, gcount(), определить, сколько именно символов удалось прочесть:
char buf[1024];
int chars_read;

cin.read(buf, sizeof(buf));
chars_read = cin.gcount();

Если кому интересно, вот ссылка на источник:
http://users.msu.dubna.ru/~ovg/c++course/p2-8.html
Более полного руководства по потокам в С++ на русском языке я пока не видел. Хотя, не очень то сильно и искал smile

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.