pyqt5 qlistwidget производительность с большими текстовыми данными - PullRequest
0 голосов
/ 25 января 2019

Я пишу приложение с графическим интерфейсом pyqt5 для анализа определенного файла журнала с приведенной ниже структурой.Каждая строка уже разделена как строки в списке и сохранена как self.calls.Этот список хранит около 60 тысяч строк данных.

Цель состоит в том, чтобы выполнить поиск, используя строку ввода пользователя, найти все идентификаторы вызовов (1,2,3 и т. Д.), В которых строка ввода находится в строке.Затем найдите все сообщения, относящиеся к этому идентификатору вызова, и отобразите их по порядку, используя qlistwidget (мне нравится чистый вид Qlistwidget. Я пробовал Qplaintext, но для отображения только self.calls потребовалось много времени)

  • У меня есть qlineedit для сбора пользовательского ввода
  • Я беру этот ввод, использую регулярное выражение, чтобы найти каждый элемент в self.calls, который совпадает с пользовательским вводом
  • Повторно использую регулярное выражение, чтобы найти все вызовыИдентификационный номер (строк, соответствующих вводу пользователя) и поместите их в список
  • Затем используйте циклы for для добавления всех строк с этим идентификатором вызова в qlistwidget

Я могу использовать qlistwidget addItemи простой цикл for для отображения всех 50К строк в self.calls, и это занимает несколько секунд (приемлемо).

for call in self.calls:
        self.output.addItem(call)

Моя проблема заключается в том, что я реализую свою функцию поиска, если имеется большое количествоСоответствие строк приводит к тому, что приложение плохо работает и требует много времени для отображения данных, хотя это небольшое подмножество данных из self.calls.Я пытался использовать вложенные для циклов с условным, списочным пониманием и для циклов с регулярным выражением.Все примерно одинаково, анализируемые 10К строк заняли, может быть, 20-30 секунд.

Надеясь, что кто-нибудь подскажет, как быстрее отобразить данные с помощью qlistwidget.

Данные:

Oct 12 18:38:34 user.info server1 host:server:  INFO : call 1: allocated for "Web client" conference participation
Oct 12 18:38:34 user.info server1 host:server:  INFO : call 1: setting up combined RTP session for DTLS (combined media and control)
Oct 12 18:38:34 user.info server1 host:server:  INFO : call 1: starting DTLS combined media negotiation (as initiator)
Oct 12 18:38:35 user.info server1 host:server:  INFO : call 1: completed DTLS combined media negotiation
Oct 12 18:38:35 user.info server1 host:server:  INFO : call 1: media framework reporting rx video RTP frequency 0 - fixed up to 90000
Oct 12 18:38:35 user.info server1 host:server:  INFO : call 1: starting DTLS combined media negotiation (as initiator)
Oct 12 18:38:36 user.info server1 host:server:  INFO : call 1: completed DTLS combined media negotiation
Oct 12 18:38:59 user.info server1 host:server:  INFO : call 1: tearing down (conference media)
Oct 12 18:51:27 user.info server1 host:server:  INFO : call 2: recognised as Avaya
Oct 12 18:51:27 user.info server1 host:server:  INFO : call 2: incoming SIP audio call from
Oct 12 18:51:40 user.info server1 host:server:  INFO : call 3: outgoing encrypted SIP call to 
Oct 12 18:51:40 user.info server1 host:server:  INFO : call 3: setting up peer to peer media instantiation
Oct 12 18:51:40 user.info server1 host:server:  INFO : call 3: setting up UDT RTP session for DTLS (combined media and control)
Oct 12 18:51:40 user.info server1 host:server:  INFO : call 3: SIP call ringing
Oct 12 18:51:40 user.info server1 host:server:  INFO : call 3: determined far end good lip sync status, 1
Oct 12 18:51:42 user.info server1 host:server:  INFO : call 3: remote layout version supported by peer now 6
Oct 12 18:51:44 user.info server1 host:server:  INFO : call 4: allocated for "Web client" conference participation
Oct 12 18:51:44 user.info server1 host:server:  INFO : call 4: setting up combined RTP session for DTLS (combined media and control)
Oct 12 18:51:44 user.info server1 host:server:  INFO : call 4: starting DTLS combined media negotiation (as initiator)
Oct 12 18:51:44 user.info server1 host:server:  INFO : call 4: completed DTLS combined media negotiation
Oct 12 18:52:47 user.info server1 host:server:  INFO : call 3: ending; local teardown - connected for 1:07

Код:

if len(self.searchbar.text()) > 2:

    self.output_filtered.setHidden(False)

    #Regex compiles
    re_searchstring = re.compile(r"(^.*?%s.*?$)" % self.searchbar.text(), re.IGNORECASE)
    re_callindex = re.compile(r"call\s(\d+):")

    #Get results of all calls matching searchbar input
    result = list(filter(re_searchstring.match, self.calls))

    #Build a temp list with call index number
    call_list_temp = []
    for item in result:
        callindex = re_callindex.findall(item)
        call_list_temp.append(callindex)
    #Merge the call list, remove dups, and sort
    call_list_temp = list(itertools.chain(*call_list_temp))
    call_list = list(OrderedDict.fromkeys(call_list_temp))

    ##############################
    # For loops with conditional
    for index in call_list:
        for calls in self.calls:
            if "call " + str(index) + ":" in calls:
                self.output_filtered.addItem(calls)

    # List Comprehension
    test = [calls for index in call_list for calls in self.calls if "call " + str(index) + ":" in calls]
    for call in test:
        self.output_filtered.addItem(call)

    # For loops with regex
    for index in call_list:
        re_callfinder = re.compile(r"(^.*call\s%s.*$)" % index)
        for item in self.calls:
            call = re_callfinder.findall(item)
            for line in call:
                self.output_filtered.addItem(line)

1 Ответ

0 голосов
/ 25 января 2019

Вы можете переключиться на Система Модель / Представление и использовать QListView вместо QListWidget. Таким образом, вы сможете воспользоваться классом QModel, который предназначен для такого рода работ ...

...