Docent
Docent15 січня 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
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

5
Ruslan Polupan
  • 15 січня 2020 р. 05:07

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

    Docent
    • 15 січня 2020 р. 05:32

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

      Виталий Антипов
      • 15 січня 2020 р. 14:44
      • (відредаговано)

      Возможно я ошибаюсь, но, насколько я помню, 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 січня 2020 р. 17:21

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

          Ruslan Polupan
          • 16 січня 2020 р. 01:42

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

            Коментарі

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

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50бали,
            • Рейтинг балів-4
            m
            • molni99
            • 26 жовтня 2024 р. 01:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80бали,
            • Рейтинг балів4
            m
            • molni99
            • 26 жовтня 2024 р. 01:29

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:20бали,
            • Рейтинг балів-10
            Останні коментарі
            ИМ
            Игорь Максимов22 листопада 2024 р. 11:51
            Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 жовтня 2024 р. 14:37
            Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 жовтня 2024 р. 08:19
            Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов05 жовтня 2024 р. 07:51
            Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas505 липня 2024 р. 11:02
            QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Тепер обговоріть на форумі
            Evgenii Legotckoi
            Evgenii Legotckoi24 червня 2024 р. 15:11
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            t
            tonypeachey115 листопада 2024 р. 06:04
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            NSProject
            NSProject04 червня 2022 р. 03:49
            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
            9
            9Anonim25 жовтня 2024 р. 09:10
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

            Слідкуйте за нами в соціальних мережах