Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение больших файлов  (Прочитано 17864 раз)
0 Пользователей и 1 Гость смотрят эту тему.
andrew2008
Гость
« : 15-10-2008 09:38 » 

Здравствуйте.
У меня есть задача прочитать текстовый файл размером 10Мб.
Самое простое что я смог придумать:
Код:
  
...
std::ifstream in;
std::string result;
...
char line[ 6144 ];
while( in.getline( line , 6144 ) ) {
result += line;
}//while
Но к сожалению работает не так быстро как хотелось.
Поскажите пожалуйста, как можно ускорить чтение?
Заранее спасибо!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 15-10-2008 09:58 » 

всё ещё зивисит от задачи - что нужно добиться ?

а читать можно:
1) последовательно
2)при помощи мапирования
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 15-10-2008 11:55 » 

andrew2008, не пользуйся string - создай буфер char[] нужного размера (лучше динамически) и считай разом.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
andrew2008
Гость
« Ответ #3 : 15-10-2008 15:56 » 

всё ещё зивисит от задачи - что нужно добиться ?

а читать можно:
1) последовательно
2)при помощи мапирования

всё ещё зивисит от задачи - что нужно добиться ?

а читать можно:
1) последовательно
2)при помощи мапирования
В целом задача такая. Надо написать программу для вызова как cgi скрипт через браузер IE которая просто читает и отображает файл размером 10Мб.
Нашел другой вариант:
   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 вроде начинает выдавать текст но потом IE уходит в себя и не возвращается???
Подскажите можно ли как-нибудь это исправить?
Записан
andrew2008
Гость
« Ответ #4 : 15-10-2008 15:57 » 

andrew2008, не пользуйся string - создай буфер char[] нужного размера (лучше динамически) и считай разом.
А как узнать размер для создания буфера и соответственно чтобы считать разом?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 16-10-2008 06:19 » 

andrew2008, ты же сам говорил 10 метров.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 16-10-2008 08:46 » 

andrew2008,

во-первых, посмотри тему

https://forum.shelek.ru/index.php/topic,14135.0.html

Там уже что-то есть.
Потом - вопрос на зысыпку: а ты знаешь как построен файл? Т.е. есть ли там построковое построение или нет? если да, то можно было бы читать строками и считанное складировать в каком-то объекте (массиве, мап-е и т.д.) - это на случай, если раземр файла заранее с точностью до байта неизвестен.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 16-10-2008 09:52 » 

нет задачи хранить в памяти файл, есть задача переложить из одного потока данные в другой
и в чём проблема?
считал-записал-считал-записал
хочешь строками через getline, хочешь через read/write
в чем сложность? нафига весь файл держать в памяти?

http://software.intel.com/en-us/articles/power-analysis-of-disk-io-methodologies

Записан

Странно всё это....
andrew2008
Гость
« Ответ #8 : 17-10-2008 09:22 » 

нет задачи хранить в памяти файл, есть задача переложить из одного потока данные в другой
и в чём проблема?
считал-записал-считал-записал
хочешь строками через getline, хочешь через read/write
в чем сложность? нафига весь файл держать в памяти?

http://software.intel.com/en-us/articles/power-analysis-of-disk-io-methodologies
Проблема именно с IE7, в opera все нормально работает.
Сделал другую реализацию:
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???
За ссылки всем спасибо!!!
Записан
andrew2008
Гость
« Ответ #9 : 17-10-2008 09:24 » 

То есть прочитал весь файл целиком.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #10 : 17-10-2008 09:28 » 

andrew2008, с IE7 много проблем. Конкретно с которой я столкнулся. Реализация календаря выпадающими списками, в FF, Opera и IE6 все гуд, а вот в IE7 не адекватное поведение, пришлось переписывать логику.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
andrew2008
Гость
« Ответ #11 : 18-10-2008 12:41 » 

Я нашел в чем была проблема правда пока не исправил ее.
У меня в программе дополнительно к выводу содержимого файла выводился небольщой 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' onClick=\"chngclr('white','black');\">Áåëî-÷åðíûé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('yellow','blue');\">Æåëòî-ãîëóáîé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('red','white');\">Êðàñíî-áåëûé<br>";
std::cout<<"<input type=\"radio\" name='clr' onClick=\"chngclr('blue','yellow');\">Ãîëóáî-æåëòûé<br><br>";
*/
std::cout<<"</form>";
readAndDisplayContent( inFile );
std::cout<<"</body></html>";
Пока не понял почему IE7 глючит на вроде простом javascript в то время как opera отрабатывает нормально,
но по крайней мере выяснилось что проблема не в выводе 10Мб файла.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 18-10-2008 13:06 » new

onClick -> onclick

document.bgColor=bg; document.fgColor=fnt;
Не верно. Используй изменение стилей.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines