Je suis en train d'afficher les résultats de vos résultats de recherche rapidement. J'ai tous les chemins de fichiers absolus pour les fichiers sur mon lecteur réseau (s) dans un seul fichier texte, ~ 50 Mo. Le script python effectue un seul passage sur chaque ligne de ce fichier [conservé sur le disque local] en une seconde ou moins, ce qui est acceptable. C'est le temps qu'il faut pour recueillir des résultats. Cependant, les résultats sont donnés dans un widget wx.TextCtrl. Les ajouter ligne par ligne à un TextCtrl wx serait ridicule. La meilleure méthode que j'ai trouvée est d'écrire les résultats dans un fichier texte, et d'appeler loadFile natif de wx.TextCtrl, qui, en fonction du nombre de résultats, charge les lignes de texte dans le volet entre 0,1 et 5 secondes ou alors. Cependant, il doit y avoir un moyen plus rapide pour 10 + Mo de texte entrant. Les résultats sont immédiatement calculés et disponibles dans le même processus que l'interface graphique ... alors s'il vous plaît, dites-moi s'il y a un moyen de canaliser/proxy/pirater ces données directement dans le TextCtrl? Est-ce que mmap aiderait ce transfert?wx.TextCtrl.LoadFile()
Répondre
Est-ce que les gens vont vraiment lire (ou ont besoin) tous les 10 Mo dans un contrôle de texte? Probablement pas.
Suggérer que vous chargiez à la demande en paginant dans certaines parties des données.
Ou mieux encore, fournissez une fonctionnalité de recherche d'utilisateur qui réduit les résultats à l'information d'intérêt.
Vous pouvez charger toutes les données à la fois avec AppendText, pourquoi vous avez besoin de le faire ligne par ligne, mais cela prendra encore quelques secondes car 10 Mo est énorme. Si vous utilisez wx.RichTextCtrl il est un peu plus rapide dans mon test chargé 10 Mo en 6 secondes au lieu de 9 secondes pour TextCtrl.
Je ne vois pas la raison pour laquelle vous devez définir toutes les données à la fois? et qui va lire 10MB? Donc, en fonction de l'objectif, il peut y avoir de meilleurs moyens.
Si vous avez besoin d'afficher toutes les données de manière super rapide, écrivez un contrôle personnalisé qui conserve une liste de lignes et rend seulement les lignes visibles dans la vue.
ici est une application de test où vous pouvez essayer différentes choses
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()
Si vous ne voulez pas peindre tout youself dans un contrôle personnalisé, vous pouvez simplement utiliser un textctrl avec barre de défilement séparée et mettre à jour le texte de textcntrl sur le défilement, donc à la fois vous allez charger quelques lignes seulement.
Edit: que vous avez dit dans votre commentaire que les données peuvent être 1-2 Mo, données 1Mo avec AppendText ne prend que 0,5 sec, je pense que c'est ok
Pour clarifier: peut-être est seulement 1-2MB, mais le GUI bloque pendant cette lecture et wx a besoin de beaucoup de temps pour le charger dans le widget que je pense pouvoir être amélioré (mais comment?). –
Pour débloquer l'interface graphique, vous devez simplement vous assurer que la file d'attente des messages est traitée pendant le chargement du fichier. – jussij