wx.TextCtrl.LoadFile () - PullRequest
       28

wx.TextCtrl.LoadFile ()

0 голосов
/ 02 октября 2009

Я пытаюсь быстро отобразить данные результатов поиска. У меня есть все абсолютные пути к файлам на моих сетевых дисках в одном текстовом файле ~ 50 МБ. Скрипт python делает один проход по каждой строке в этом файле [хранится на локальном диске] в секунду или меньше, и это приемлемо. Это время, необходимое для сбора результатов.

Однако результаты приведены в виджете wx.TextCtrl. Добавлять их построчно к wx TextCtrl было бы смешно. Лучший метод, который я придумал, - это записать результаты в текстовый файл и вызвать wx.TextCtrl's LoadFile native, который, в зависимости от количества результатов, загружает строки текста в панель в течение от 0,1 до 5 секунд или так. Однако должен быть более быстрый способ для 10 + МБ входящего текста. Результаты сразу же вычисляются и доступны в том же процессе, что и графический интерфейс ... поэтому, пожалуйста, скажите, есть ли способ передать / прокси / взломать эти данные непосредственно в TextCtrl? Поможет ли mmap этот перенос?

Ответы [ 2 ]

0 голосов
/ 03 октября 2009

Вы можете загрузить все данные одновременно с AppendText, поэтому вам нужно делать это построчно, но все равно это займет несколько секунд, так как 10 МБ огромно. Если вы используете wx.RichTextCtrl, это немного быстрее в моем тесте он загрузил 10 МБ за 6 секунд вместо 9 секунд для TextCtrl.

Не вижу причины, по которой вам нужно установить все данные сразу? а кто будет читать 10Мб?

Так что в зависимости от цели могут быть лучшие способы.

Если вам нужно отобразить все данные очень быстро, напишите пользовательский элемент управления, который хранит список строк и отображает только те строки, которые видны в представлении.

вот тестовое приложение, в котором вы можете попробовать различные вещи

import wx
import wx.richtext
import string
import time

# create a big text
line = string.ascii_letters+"\n"
bigText = line*200000

app = wx.PySimpleApp()
myframe = wx.Frame(None)
#tc = wx.TextCtrl(myframe, style=wx.TE_MULTILINE)
tc = wx.richtext.RichTextCtrl(myframe)
def loadData():
    s = time.time()
    tc.SetMaxLength(len(bigText))
    tc.AppendText(bigText)
    print time.time()-s

# load big text after 5 secs
wx.CallLater(5000, loadData)

app.SetTopWindow(myframe)
myframe.Show()
app.MainLoop()

Если вы не хотите рисовать все сами в пользовательском элементе управления, вы можете просто использовать textctrl с отдельной полосой прокрутки и обновлять текст textcntrl при прокрутке, поэтому одновременно вы будете загружать только несколько строк.

Редактировать: как вы сказали в своем комментарии, что данные могут быть 1-2 МБ, данные 1 МБ с AppendText занимают всего 0,5 секунды. Я думаю, что это нормально

0 голосов
/ 02 октября 2009

Люди действительно собираются прочитать (или нуждаются) все 10 МБ в текстовом элементе управления? Вероятно, нет.

Предположим, что вы загружаете по требованию, разбивая части данных на части.

Или, что еще лучше, предоставьте некоторые функции поиска пользователей, которые сужают результаты до интересующей информации.

...