Docent
DocentҚаң. 15, 2020, 3: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, 5:07 Т.Ж.

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

    Docent
    • Қаң. 15, 2020, 5:32 Т.Ж.

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

      Виталий Антипов
      • Қаң. 15, 2020, 2: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, 5:21 Т.Қ.

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

          Ruslan Polupan
          • Қаң. 16, 2020, 1:42 Т.Ж.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            Г

            C++ - Тест 001. Первая программа и типы данных

            • Нәтиже:66ұпай,
            • Бағалау ұпайлары-1
            t

            C++ - Тест 001. Первая программа и типы данных

            • Нәтиже:33ұпай,
            • Бағалау ұпайлары-10
            t

            Qt - Тест 001. Сигналы и слоты

            • Нәтиже:52ұпай,
            • Бағалау ұпайлары-4
            Соңғы пікірлер
            G
            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssrАқп. 8, 2024, 6:43 Т.Қ.
            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Енді форумда талқылаңыз
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            F
            FynjyШілде 22, 2024, 4:15 Т.Ж.
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
            BlinCT
            BlinCTМаусым 25, 2024, 1 Т.Ж.
            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
            BlinCT
            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            Evgenii Legotckoi
            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

            Бізді әлеуметтік желілерде бақылаңыз