Docent
Docent15. Januar 2020 03:07

Как построить очень большую таблицу

Имеется текстовый файл >350 Мб (логи).
В файле колонки разделены табуляцией, строки - переносом.
Количество столбцов в файле 37.
Количество строк в файле > 13 000 000.
Задача1 - отобразить данные в виде таблицы...
До графиков еще не дошел, проблема с таблицей.
Попытка реализации следующая:
Реализуем свой QAbstractTableModel с минимумом функций:
- добавить строку в модель (QStringList)
- прочитать строку
Читаем файл построчно - заполняем модель, отображаем в tableView.
Проблема - std::bad_alloc и вылет (core i7, 16Gb).
При ограничении чтения файла счетчиком строк (например 800 000) модель влезает нормально, при этом программа кушает 1.5Гб оперативки.
Вылет происходит когда программа достигает 1.7Гб оперативки.
Открытие полного файла в SublimeText3 +950Мб оперативки без проблем.
Проблема стоит, пока планирую выводить только интересные отклонения в данных.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

5
Ruslan Polupan
  • 15. Januar 2020 05:07

А если текстовый файл перегнать в таблицу БД SQLite и потом уже с ним работать?

    Docent
    • 15. Januar 2020 05:32

    это не решит проблему построения большой таблицы, ведь мы заполняем модель не важно из БД или читая файл построчно

      Виталий Антипов
      • 15. Januar 2020 14:44
      • (bearbeitet)

      Возможно я ошибаюсь, но, насколько я помню, sqlite не возвращает количество записей в запросе. А в этом Ваше решение. В модель записывается максимум определенное количество строк результата запроса (сколько точно не могу вспомнить, 512 что ли). А использование fetchMore() позволяет дозагружать данные в модель по необходимости:

      while (myModel->canFetchMore())
          myModel->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 и виджеты с точки зрения потребления памяти интерфейсом, но думаю, вам все же стоит потестировать вариант с БД.

        Docent
        • 15. Januar 2020 17:21

        Идея неплохая. Посмотрел в примере - в модель подгружаются данные по мере необходимости. Добавить еще удаление (QAbstractItemModel::removeRows) данных из модели которые вне зоны видимости и будет совсем хорошо. Правда будут проблемы при попытке выделить кусок данных в таблице, если он окажется больше чем тот объем который мы грузим в модель (например для отображения выбрали 100 строк, подгружаем и удаляем при прокрутке, а захотелось выделить данные из 1000, тут как-то придется привычное выделение в таблице и копирование задавать параметрически отдельно от таблицы).
        С отображением графиков пока проблем не возникло.

          Ruslan Polupan
          • 16. Januar 2020 01:42

          У меня модель работает сейчас с 28 252 766 записями в таблице. Правда база данных Firebird. Особых тормозов не замечаю, сложные выборки делаю в потоках.

            Kommentare

            Nur autorisierte Benutzer können Kommentare posten.
            Bitte Anmelden oder Registrieren
            Letzte Kommentare
            A
            ALO1ZE19. Oktober 2024 08:19
            Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов5. Oktober 2024 07:51
            Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas55. Juli 2024 11:02
            QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssr8. Februar 2024 18:43
            Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Jetzt im Forum diskutieren
            J
            JacobFib17. Oktober 2024 03:27
            добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
            JW
            Jhon Wick1. Oktober 2024 15:52
            Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
            КГ
            Кирилл Гусарев27. September 2024 09:09
            Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
            F
            Fynjy22. Juli 2024 04:15
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

            Folgen Sie uns in sozialen Netzwerken