Как построить очень большую таблицу
Имеется текстовый файл >350 Мб (логи).
В файле колонки разделены табуляцией, строки - переносом.
Количество столбцов в файле 37.
Количество строк в файле > 13 000 000.
Задача1 - отобразить данные в виде таблицы...
До графиков еще не дошел, проблема с таблицей.
Попытка реализации следующая:
Реализуем свой QAbstractTableModel с минимумом функций:
- добавить строку в модель (QStringList)
- прочитать строку
Читаем файл построчно - заполняем модель, отображаем в tableView.
Проблема - std::bad_alloc и вылет (core i7, 16Gb).
При ограничении чтения файла счетчиком строк (например 800 000) модель влезает нормально, при этом программа кушает 1.5Гб оперативки.
Вылет происходит когда программа достигает 1.7Гб оперативки.
Открытие полного файла в SublimeText3 +950Мб оперативки без проблем.
Проблема стоит, пока планирую выводить только интересные отклонения в данных.
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
А если текстовый файл перегнать в таблицу БД SQLite и потом уже с ним работать?
это не решит проблему построения большой таблицы, ведь мы заполняем модель не важно из БД или читая файл построчно
Возможно я ошибаюсь, но, насколько я помню, sqlite не возвращает количество записей в запросе. А в этом Ваше решение. В модель записывается максимум определенное количество строк результата запроса (сколько точно не могу вспомнить, 512 что ли). А использование fetchMore() позволяет дозагружать данные в модель по необходимости:
На практике я создавал кастомную таблицу используя QSqlQueryModel и ListView. У меня несколько тысяч строк в таблице, но грузится она очень быстро. Как я понимаю сразу выводятся первые 512 (или что-то около того) строк запроса, потребление памяти начинает расти только по мере прокрутки таблицы. Тут скорее всего и происходит дозагрузка модели данными.
Из документации:
If the database doesn't return the number of selected rows in a query, the model will fetch rows incrementally. See fetchMore() for more information.
Update: Извиняюсь, очень сильно наврал. Провел тест на данных около 2000 строк и 100 000 строк. Метод fetchmore() насильно грузит данные в модель, что заставляет перегружать интерфейс таблицы всеми строками и потреблять много памяти. При отключении этого метода, по линейке прокрутки таблицы видно, что не все строки загружены в таблицу. Они подгружаются по мере прокрутки таблицы. Здесь мне трудно сравнивать qml и виджеты с точки зрения потребления памяти интерфейсом, но думаю, вам все же стоит потестировать вариант с БД.
Идея неплохая. Посмотрел в примере - в модель подгружаются данные по мере необходимости. Добавить еще удаление (QAbstractItemModel::removeRows) данных из модели которые вне зоны видимости и будет совсем хорошо. Правда будут проблемы при попытке выделить кусок данных в таблице, если он окажется больше чем тот объем который мы грузим в модель (например для отображения выбрали 100 строк, подгружаем и удаляем при прокрутке, а захотелось выделить данные из 1000, тут как-то придется привычное выделение в таблице и копирование задавать параметрически отдельно от таблицы).
С отображением графиков пока проблем не возникло.
У меня модель работает сейчас с 28 252 766 записями в таблице. Правда база данных Firebird. Особых тормозов не замечаю, сложные выборки делаю в потоках.