10 / 8 / 4
Регистрация: 24.01.2017
Сообщений: 111
1

Как фильтровать большой объем данных?

26.06.2018, 14:51. Показов 793. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
использую QSortFilterProxyModel

я вначале загружаю файл, скажем 6 Мегобайт
все это загружается, через секунду отображает в таблице
потом все это фильтруется. Вот такое вот написал:

строк больше 66к
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool SortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & sourceParent) const
{
    if (m_include || m_exclude)
    {
        for (int i = 0; i < sourceModel()->columnCount(); i++)
        {
            QModelIndex index = sourceModel()->index(sourceRow, i, sourceParent);
            QString str = sourceModel()->data(index).toString();
 
            if ((str.contains(m_inc1) && !m_inc1.isEmpty())
                || (str.contains(m_inc2) && !m_inc2.isEmpty())
                || (str.contains(m_inc3) && !m_inc3.isEmpty()))
 
                return true;
            else return false;
        }
    }
    return true;
}
этот код работает немного дольше из-за того что он проходит по всем клеткам таблицы
Есть три разные строки которые я ищу.
Вот в чем проблема. Как это оптимизировать?
C++ (Qt)
1
QString m_inc1= 66666;
отображает секунд через 7 примерно

Добавлено через 8 минут
А ведь это только которые включают подстроку. А что будет если добавить по мимо этого исключающую...

Добавлено через 4 минуты
Я тут еще понял, что у меня колонки невидимые учитывает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2018, 14:51
Ответы с готовыми решениями:

QAbstractTableModel и большой объем данных
Создал свою модель наследованную от QAbstractTableModel и отображаю ее в QTableView. Есть список...

Как вывести большой объём текста?
При использовании QTextEdit или QPlainTextEdit Если попытаться вывести за 1 цикл, текста больше...

Как передать большой объем данных клиенту
Есть хостинг с поддержкой PHP, Perl 5, Parser, Python, Ruby, C++ Суть такая: на компьютере юзера...

Как скопировать большой объём данных с проверкой на ошибки?
Здравствуйте! Есть 2 диска - внешний и внутренний! На обоих их них много общего, но есть и много...

5
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
26.06.2018, 15:53 2
Чтобы как-то ускорить, можно разбить условие и сделать 3 if () return; вместо условия, но это не сильно ускорит обработку
Цитата Сообщение от Env Посмотреть сообщение
if ((str.contains(m_inc1) && !m_inc1.isEmpty()) || (str.contains(m_inc2) && !m_inc2.isEmpty()) || (str.contains(m_inc3) && !m_inc3.isEmpty())) return true;
Добавлено через 7 минут
Если поиск может быть регистронезависимым, то попробуйте использовать флаг Qt::CaseInsensitive в contains

Добавлено через 2 минуты
хотя не уверен что мой последний совет ускорит процесс, скорее наоборот
1
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
26.06.2018, 19:03 3
Так там строки или числа? Что за 66666?
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.06.2018, 19:08 4
А зачем бегать по всей модели, когда в данный метод приходит конкретный индекс, который просит его отфильтровать?
0
10 / 8 / 4
Регистрация: 24.01.2017
Сообщений: 111
27.06.2018, 08:06  [ТС] 5
нет. Он возвращает парента этой строки (нужно для иерархической структуры) и номер строки. Следовательно, я должен пробегаться по всем колонкам, а не только по одной. Находить индекс ее, узнавать то, что она содержит.. и сравнивать каждую колонку в каждой строке
Returns true if the item in the row indicated by the given source_row and source_parent should be included in the model; otherwise returns false.
The default implementation returns true if the value held by the relevant item matches the filter string, wildcard string or regular expression.

Добавлено через 1 час 13 минут
не возвращает, а принмает..
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
27.06.2018, 10:42 6
Можно попробовать часть условий вынести из цикла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool SortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & sourceParent) const
{
    if (m_include || m_exclude)
    {
        if(m_inc1.isEmpty() && m_inc2.isEmpty() && m_inc3.isEmpty())
            return false;
 
        bool res_incl[3] = {m_inc1.isEmpty(), m_inc2.isEmpty(), m_inc3.isEmpty()};
 
        for (int i = 0; i < sourceModel()->columnCount(); i++)
        {
            QModelIndex index = sourceModel()->index(sourceRow, i, sourceParent);
            QString str = sourceModel()->data(index).toString();
 
            if ((res_incl[0] && str.contains(m_inc1))
                || (res_incl[1] && str.contains(m_inc2))
                || (res_incl[2] && str.contains(m_inc3)))
 
                return true;
            else
                return false;
        }
    }
    return true;
}
0
27.06.2018, 10:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2018, 10:42
Помогаю со студенческими работами здесь

Как перенести большой объем данных из одной БД в другую?
Делаем сейчас data warehouse и нужно перенести большой объем данных из одной БД в другую. Бэкап -...

Большой объём данных
В общем, есть проект, игра, жанр стратегия, варгейм, только в онлайн режиме и только по мобильные...

ReportViewer Большой объем данных
Здравствуйте, использую на сайте в доменной сети C# элемент ReportViewer для отображения отчетов......

Скопировать большой объём данных
Имеются два txt-файла почти по 100К строк (каждый порядка 3 МБ весит). Нужно &quot;скрестить&quot; эти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru