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

Тема в разделе "LANGS.C", создана пользователем andrew2008, 15 окт 2008.

  1. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Здравствуйте.
    У меня есть задача прочитать текстовый файл размером 10Мб.
    Самое простое что я смог придумать:
    Код (Text):
    1.  
    2. ...
    3. std::ifstream in;
    4. std::string result;
    5. ...
    6. char line[ 6144 ];
    7. while( in.getline( line , 6144 ) ) {
    8.         result += line;
    9. }//while
    Но к сожалению работает не так быстро как хотелось.
    Поскажите пожалуйста, как можно ускорить чтение?
    Заранее спасибо!
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    andrew2008
    поищи на rsdn.ru в ветке по С++. там вариантов штук 10 есть решения твоей задачи с тестами их скорострельности:)

    updated: вот, нашел: http://www.rsdn.ru/Forum/message/1186457.flat.aspx
     
  3. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Самое простое - не использовать std::
    IMHO, с 10 Mb лучше всего работать через маппинг - со скоростью дискового доступа.
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    10 мб -- не громадный объем данных, так что я бы юзал std::
    раз выделил (не забыв потом освободить ессно), и забыл. зачем меппинг и прочие сложности??
    для начала потестили бы скорость работы при использовании std::, а потом уже к меппингу свой взгляд обратили ИМХО.
    тем более, что обращаясь к меппингу, мы делаем программу ОСезависимой.
     
  5. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    В целом надо сделать следующее, вызвать программу как cgi скрипт в браузере IE7, которая просто отображает 10Мб файл.
    Попробовал некоторые варианты из ссылки http://www.rsdn.ru/Forum/message/1186457.flat.aspx.
    varnie - огромное Вам спасибо!!!
    Самый быстрый вариант:
    Код (Text):
    1. std::string str;
    2. in.seekg( 0, std::ios_base::end);
    3. std::ifstream::pos_type len = in.tellg();
    4. in.seekg( 0 );
    5. str.resize( len);
    6. in.read( (char*)str.data(), len);
    Читаю файл целиком.
    В opera все работает отлично.
    В IE начинает выкидывать текст а потом зависает, начинает дебагер вызывать и все - крэш.
    А надо именно для IE7!
    Подскажите как можно сделать?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А зачем string? Работать с простым буфером imho логичнее, и безгеморойнее. И не забываем проверять сколько прочитали функой read.
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    я думаю, здесь проблемы не реализации, а чисто внешние: IE7. крайне сложно посоветовать что-либо с этим далее делать. а ежели просто файл открыть 10меговый в IE7, он не упадет? проверьте плз.
     
  8. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Просто файл он открывает, но открывал он 10Мб файл наверно минут 10:)))
    Но проблем не возникало, то есть он не подвисал, скролл нормально бегал все время.
    Может надо чтобы программа выводила по 0.2Мб и засыпала на время:)?
     
  9. andrew2008

    andrew2008 New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    11
    Я нашел в чем была проблема правда пока не исправил ее.
    У меня в программе дополнительно к выводу содержимого файла выводился небольщой javascript.
    Код (Text):
    1. std::cout<<"<html>";
    2. std::cout<<"<script type='text/javascript' language='JavaScript'>function chngclr(bg,fnt) {";
    3. std::cout<<"document.bgColor=bg; document.fgColor=fnt; }</script>";
    4. std::cout<<"<form>";
    5. //если это расскометарить то IE7 умрет
    6. /*
    7. std::cout<<"<input type=\"radio\" checked name='clr' onClick=\"chngclr('white','black');\">Áåëî-÷åðíûé<br>";
    8. std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('yellow','blue');\">Æåëòî-ãîëóáîé<br>";
    9. std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('red','white');\">Êðàñíî-áåëûé<br>";
    10. std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('blue','yellow');\">Ãîëóáî-æåëòûé<br><br>";
    11. */
    12. std::cout<<"</form>";
    13. readAndDisplayContent( inFile );
    14. std::cout<<"</body></html>";
    Пока не понял почему IE7 глючит на вроде простом javascript в то время как opera отрабатывает нормально,
    но по крайней мере выяснилось что проблема не в выводе 10Мб файла.
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    А просто всосать весь файл в память и найти в нём переводы строки уже не модно? Задачу же не на 80386 с 4 метрами ОЗУ требуется решить, ведь правда?