Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка большого файла в QStringList, объясните новичку 
:(
    Опции темы
Matematik
Дата 25.5.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Как быстро загрузить файл в QStringList?
Пробую на файле 50мб с 2'500'000 (два миллиона с половинкой) строк
Код

void MainWindow::click_button()
{
    QFile File("1.txt");
    if (File.open(QIODevice::ReadOnly))
    {
        QTime myTimer;
        myTimer.start();
        QStringList Buffer;
        while (!File.atEnd())
        {
            Buffer.append(File.readLine());
        }
        int nMilliseconds = myTimer.elapsed();
        QString str = QString( "Loaded %1 lines at %2 ms" )
                                .arg( Buffer.length() )
                                .arg( nMilliseconds );
        QMessageBox::information(this, "time-", str);
    }
    File.close();

Жму кнопку первый раз - 5сек, второй - 10сек. Почему-то получается дольше.
И еще, после закрытия QMessageBox::information() MainWindow зависает на полсекунды.
Что делаю не так?

Qt только начал изучать и само собой сравниваю с Delphi, который неплохо знаю.

Например в Delphi таким же методом добавления
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  t : cardinal;
  s : TStringList;
  f : TextFile;
  z : AnsiString;
begin
  t := GetTickCount;
  AssignFile(f, '1.txt');
  Reset(f);
  s := TStringList.Create;
  while not eof(f) do
  begin
    Readln(f, z);
    s.Add(z);
  end;
  t := GetTickCount - t;
  // 2сек
  ShowMessage(Format('Loaded %d lines at %d ms', [s.Count, t]));
  s.Free;
  CloseFile(f);
end;

Обрабатывает стабильно 2сек без скачков в стороны.
Если делать встроенным методом TStringList.LoadFromFile() - грузит чуть меньше секунды
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  t : cardinal;
  s : TStringList;
begin
  t := GetTickCount;
  s := TStringList.Create;
  s.LoadFromFile('1.txt');
  t := GetTickCount - t;
  // <1сек
  ShowMessage(Format('Loaded %d lines at %d ms', [s.Count, t]));
  s.Free;
end;

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


Hacker
****


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

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



Лучше используй QTextStream.

Кстати TStringList вылетает с исключением гораздо раньше, чем успевает закончится память.

Это сообщение отредактировал(а) SABROG - 25.5.2009, 14:02


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Matematik, Не понятно почему с каждым кликом дольше.
QStringList - это QList<QString>. Добавляет он быстро.
Поэкспериментируй с QVector<QString>. Но векторы плохо подходят для частого изменения размера. По этому, подумай как ты можешь задать ему размер до загрузки.

Добавлено через 58 секунд
Цитата(SABROG @  25.5.2009,  13:58 Найти цитируемый пост)
Лучше используй QTextStream.

Не соглашусь. Экспериментально установил что он работает тяжелее.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
just_geek
Дата 26.5.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А зачем часто менять размер QVector ? сделать reserve равный размеру файла и усе... 

А текущее решение вообще какое-то не оптимальное, имхо. Будет дикая фрагментация памяти.
PM MAIL   Вверх
andrew_121
Дата 26.5.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(andrew_121 @  26.5.2009,  14:20 Найти цитируемый пост)
По этому, подумай как ты можешь задать ему размер до загрузки.


just_geek, А я разве об этом не упомянул?  smile 

Цитата(just_geek @  26.5.2009,  16:20 Найти цитируемый пост)
А текущее решение вообще какое-то не оптимальное, имхо. Будет дикая фрагментация памяти. 

Это уже другой вопрос.

Добавлено через 51 секунду
Цитата(just_geek @  26.5.2009,  16:20 Найти цитируемый пост)
сделать reserve равный размеру файла и усе... 

А вот с этого места по подробней плиз...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
just_geek
Дата 26.5.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

сделать reserve равный размеру файла и усе... 

ой, ну я гоню smile

Проще помойму загнать все в один массив, а потом только сохранить указатели на строки и все.
PM MAIL   Вверх
SABROG
Дата 26.5.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



В принципе не мудрено почему медленно, Qt каждую строку в юникод переводит.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 27.5.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(SABROG @  26.5.2009,  21:53 Найти цитируемый пост)
В принципе не мудрено почему медленно, Qt каждую строку в юникод переводит.

Гы smile Внатуре smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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