0

我正在尝试快速显示搜索结果数据。我在一个约 50MB 的文本文件中拥有网络驱动器上文件的所有绝对文件路径。python 脚本在一秒钟或更短的时间内对这个文件中的每一行 [保存在本地驱动器上] 进行一次传递,这是可以接受的。这是收集结果所需的时间。

但是,结果在 wx.TextCtrl 小部件中给出。将它们逐行附加到 wx TextCtrl 将是荒谬的。我想出的最好的方法是将结果写入一个文本文件,然后调用 wx.TextCtrl 的 LoadFile native,根据结果的数量,它会在 0.1 到 5 秒之间将文本行加载到窗格中,或者所以。但是,对于 10+MB 的文本入站必须有更快的方法。结果立即计算并在与 GUI 相同的过程中可用......所以请告诉我有什么方法可以将数据直接管道/代理/破解到 TextCtrl 中?mmap 会帮助这种转移吗?

4

2 回答 2

0

人们真的会阅读(或需要)所有 10MB 的文本控件吗?可能不是。

建议您通过分页部分数据来按需加载。

或者更好的是,提供一些用户搜索功能,将结果缩小到感兴趣的信息。

于 2009-10-01T23:49:32.213 回答
0

您可以使用 AppendText 一次加载所有数据,为什么需要逐行加载,但仍然需要几秒钟,因为 10MB 很大。如果您使用 wx.RichTextCtrl,它在我的测试中会更快一些,它在 6 秒内加载 10 MB,而不是 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 数据只需要 0.5 秒我认为没关系

于 2009-10-03T05:32:18.263 回答