Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение больших файлов

26K
15 октября 2008 года
help4you
21 / / 18.10.2007
Здравствуйте.
У меня есть задача прочитать текстовый файл размером 10Мб.
Самое простое что я смог придумать:
 
Код:
...
std::ifstream in;
std::string result;
...
char line[ 6144 ];
while( in.getline( line , 6144 ) ) {
        result += line;
}//while

Но к сожалению работает не так быстро как хотелось.
Поскажите пожалуйста, как можно ускорить чтение?
Заранее спасибо!
288
15 октября 2008 года
nikitozz
1.2K / / 09.03.2007
Использовать проекцию файла в память, может будет побыстрее, хотя не факт. И еще - по-моему это не самая лучшая задумка, "сложить" все содержимое файла в один string
26K
15 октября 2008 года
help4you
21 / / 18.10.2007
Цитата: nikitozz
Использовать проекцию файла в память, может будет побыстрее, хотя не факт. И еще - по-моему это не самая лучшая задумка, "сложить" все содержимое файла в один string



Подскажите как лучше сделать?
Просто в своей работе мне с таким сталкиваться не приходилось, у меня на работе используется БД для таких целей, но тут понадобилось?

288
15 октября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: help4you
Подскажите как лучше сделать?
Просто в своей работе мне с таким сталкиваться не приходилось, у меня на работе используется БД для таких целей, но тут понадобилось?



А в чем собственно состоит конечная цель? Зачем вам читать этот файл?

26K
15 октября 2008 года
help4you
21 / / 18.10.2007
Цитата: nikitozz
А в чем собственно состоит конечная цель? Зачем вам читать этот файл?


В целом надо иметь возможность вызвать эту программу как cgi скрипт в IE. Нашел другой вариант реализации:

std::string s;
s.erase();
if(in.bad()) return "";
//
// attempt to grow string buffer to match file size,
// this doesn't always work...
s.reserve(in.rdbuf()->in_avail());
char c;
while(in.get(c))
{
// use logarithmic growth stategy, in case
// in_avail (above) returned zero:
if(s.capacity() == s.size())
s.reserve(s.capacity() * 3);
s.append(1, c);
}

В opera прекрасно работает, приемлемо быстро. Чертов IE начинает вроде отображать текст а потом уходит в себя и не возвращается, но надо именно в нем.
Подскажите как-можно это исправить?

342
16 октября 2008 года
Yos
209 / / 21.06.2003
А чем плох вариант выделения памяти под весь файл и чтение его одным вызовом, при этом скорость зависит в основном от загрузки системы и привода? Ведь файл нужен наверное весь целиком, а не часть...
26K
17 октября 2008 года
help4you
21 / / 18.10.2007
Цитата: Yos
А чем плох вариант выделения памяти под весь файл и чтение его одным вызовом, при этом скорость зависит в основном от загрузки системы и привода? Ведь файл нужен наверное весь целиком, а не часть...



Сделал другую реализацию, прочитал весь файл разом
std::string str;
in.seekg( 0, std::ios_base::end);
std::ifstream::pos_type len = in.tellg();
in.seekg( 0 );
str.resize( len);
in.read( (char*)str.data(), len);
работает очень быстро, но опять таки в IE7 начинает виснуть, дебагер вызывает и все- крэш.
А нужно именно в IE7???

11
17 октября 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: help4you
Сделал другую реализацию, прочитал весь файл разом
std::string str;
in.seekg( 0, std::ios_base::end);
std::ifstream::pos_type len = in.tellg();
in.seekg( 0 );
str.resize( len);
in.read( (char*)str.data(), len);
работает очень быстро, но опять таки в IE7 начинает виснуть, дебагер вызывает и все- крэш.
А нужно именно в IE7???


попробуй вместо
str.resize( len);
basic_string::reserve (len +1)

26K
17 октября 2008 года
help4you
21 / / 18.10.2007
reserve же просто резервирует память а не выделяет.
На самом деле на мой взгляд проблема не в том чтобы прочитать, читается нормально. то есть примерно 3 секунды уходит на чтение, это нормально.
а вот при выводе с помощью cout сразу 10Мб IE7 видно сходит с ума.
26K
18 октября 2008 года
help4you
21 / / 18.10.2007
Я нашел в чем была проблема правда пока не исправил ее.
У меня в программе дополнительно к выводу содержимого файла выводился небольщой javascript.
Код:
std::cout<<"<html>";
std::cout<<"<script type='text/javascript' language='JavaScript'>function chngclr(bg,fnt) {";
std::cout<<"document.bgColor=bg; document.fgColor=fnt; }</script>";
std::cout<<"<form>";
//если это расскометарить то IE7 умрет
/*
std::cout<<"<input type=\"radio\" checked name='clr' &#111;&#110;Click=\"chngclr('white','black');\">&#193;&#229;&#235;&#238;-&#247;&#229;&#240;&#237;&#251;&#233;<br>";
std::cout<<"<input type=\"radio\" name='clr' &#111;&#110;Click=\"chngclr('yellow','blue');\">&#198;&#229;&#235;&#242;&#238;-&#227;&#238;&#235;&#243;&#225;&#238;&#233;<br>";
std::cout<<"<input type=\"radio\" name='clr' &#111;&#110;Click=\"chngclr('red','white');\">&#202;&#240;&#224;&#241;&#237;&#238;-&#225;&#229;&#235;&#251;&#233;<br>";
std::cout<<"<input type=\"radio\" name='clr' &#111;&#110;Click=\"chngclr('blue','yellow');\">&#195;&#238;&#235;&#243;&#225;&#238;-&#230;&#229;&#235;&#242;&#251;&#233;<br><br>";
*/
std::cout<<"</form>";
readAndDisplayContent( inFile );
std::cout<<"</body></html>";

Пока не понял почему IE7 глючит на вроде простом javascript в то время как opera отрабатывает нормально,
но по крайней мере выяснилось что проблема не в выводе 10Мб файла.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог