Docent
DocentJan. 15, 2020, 2:07 p.m.

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

Имеется текстовый файл >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
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!

5
Ruslan Polupan
  • Jan. 15, 2020, 4:07 p.m.

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

    Docent
    • Jan. 15, 2020, 4:32 p.m.

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

      Виталий Антипов
      • Jan. 16, 2020, 1:44 a.m.
      • (edited)

      Возможно я ошибаюсь, но, насколько я помню, 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
        • Jan. 16, 2020, 4:21 a.m.

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

          Ruslan Polupan
          • Jan. 16, 2020, 12:42 p.m.

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

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            Ua

            Qt - Test 001. Signals and slots

            • Result:84points,
            • Rating points4
            Ua

            Qt - Test 001. Signals and slots

            • Result:42points,
            • Rating points-8
            ОК

            Qt - Test 001. Signals and slots

            • Result:47points,
            • Rating points-6
            Last comments
            ИМ
            Игорь МаксимовNov. 22, 2024, 9:51 p.m.
            Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
            Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZEOct. 19, 2024, 5:19 p.m.
            Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь МаксимовOct. 5, 2024, 4:51 p.m.
            Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas5July 5, 2024, 8:02 p.m.
            QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Now discuss on the forum
            f
            firstlunoxodFeb. 15, 2025, 1:46 p.m.
            Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
            Дмитрий
            ДмитрийFeb. 3, 2025, 4:24 p.m.
            Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
            NW
            Nayo WaiJan. 30, 2025, 7:22 p.m.
            не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
            n
            nklyJan. 3, 2025, 12:52 p.m.
            Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
            M
            MarselAug. 17, 2023, 12:26 a.m.
            OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

            Follow us in social networks