我正在尝试快速显示搜索结果数据。我将网络驱动器上文件的所有绝对文件路径保存在一个大约50MB的文本文件中。python脚本在一秒钟或更短的时间内遍历保存在本地驱动器上的该文件中的每一行,这是可以接受的。这就是收集结果所需的时间。
但是,结果是在wx.TextCtrl小部件中给出的。将它们逐行附加到wx TextCtrl将是荒谬的。我想出的最好的方法是将结果写到一个文本文件中,并调用wx.TextCtrl的本机LoadFile,它根据结果的数量,在0.1到5秒左右的时间内将文本行加载到窗格中。但是,对于文本入站的10+MB,必须有一种更快的方法。结果会立即计算出来,并在与GUI相同的过程中可用。所以,请告诉我,有没有什么方法可以通过管道/代理/黑客将数据直接发送到TextCtrl中?mmap能帮助这种转移吗?
发布于 2009-10-01 15:49:32
人们真的要在一个文本控件中读取(或需要)全部10MB的内容吗?可能不会。
建议您通过对部分数据进行分页来按需加载。
或者更好的是,提供一些用户搜索功能,将结果范围缩小到感兴趣的信息。
发布于 2009-10-02 21:32:18
你可以使用AppendText一次加载所有的数据,为什么你需要逐行加载,但仍然需要几秒钟的时间,因为10MB是巨大的。如果你使用wx.RichTextCtrl,在我的测试中它会更快一些,它在6秒内加载10MB,而不是TextCtrl的9秒。
我不明白为什么你需要一次设置所有的数据?那么谁来读10MB呢?
因此,根据目的,可以有更好的方法。
如果您需要以超级快速的方式显示所有数据,请编写一个自定义控件,该控件保留行的列表,并且只在视图中呈现可见的行。
这是一个测试应用程序,您可以在其中尝试各种功能
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 MB,使用AppendText的1MB数据只需要.5秒我认为这是可以的
https://stackoverflow.com/questions/1507075
复制相似问题