Я пишу приложение с графическим интерфейсом 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)