2009-08-28 4 views
0

Je suis débutant en script python. Je veux lire les enregistrements de base de données msaccess et écrire dans le fichier XML. La table de base de données Access a plus de 20000 enregistrements.Threads en python

Maintenant, je suis capable de faire mais, cela prend 4 à 5 minutes. Donc, je implémente le concept de filetage. Mais le filetage prend également plus de 5 à 6 minutes. Parce que chaque thread ouvre la source de données en lisant les enregistrements des tables et ferme la source de données.

Je ne sais pas comment résoudre les problèmes.

CODE:

class ConfigDataHandler(Thread): 

    def __init__(self, dev): 
    Thread.__init__(self) 
    self.dev = dev 

    def run(self):  
    db_source_path = r'D:\sampleDB.mdb' 
    db_source = win32com.client.Dispatch(r'ADODB.Connection') 
    db_source.ConnectionString = 'PROVIDER=Microsoft.Jet.OLEDB.4.0; 
           DATA SOURCE=' + db_source_path + ';' 
    db_source.Open() 

    query = """ SELECT * from table""" 
    source_rs = win32com.client.Dispatch(r'ADODB.Recordset') 
    source_rs.Open(query, db_source, 3, 1) 

    while not source_rs.EOF : 
     f_units.append(source_rs.fields("Name").Value)) 
     source_rs.MoveNext() 
    source_rs.Close() 
    db_source.Close() 

    out = render(f_units) 
    open("D:/test.xml", "w").write(out) 

d_list = get_dev_list() 
for d in d_list:  
    current = ConfigDataHandler(d) 
    current.start() 
+0

Pouvez-vous s'il vous plaît coller votre extrait de code ici? –

+1

Avez-vous utilisé un profileur pour voir où le temps est passé? Je parie que 80% du temps est dans la connexion ODBC à Jet. Pouvez-vous profiler votre programme pour rassembler quelques faits? –

Répondre

5

Comme mentionné s'il vous plaît coller l'extrait de code. Les premiers threads ont un temps de synchronisation qui ralentit l'exécution de plusieurs threads. Deuxièmement, la base de données msaccess/JET est très lente et n'est pas vraiment adaptée à une utilisation multithread. Vous pourriez considérer SQL Server à la place - SQL Server Express est gratuit. Troisièmement, c'est probablement la base de données qui ralentit le traitement. Quels index avez-vous? Quelles requêtes faites-vous? Que dit "expliquer"?

+4

+1: Les threads ne font pas "magiquement" un programme lié aux E/S aller plus vite. –

+0

Merci d'avoir posté votre code. Je peux immédiatement voir quelques problèmes. self.dev n'est pas utilisé. Vous voulez probablement utiliser self.dev dans une clause WHERE pour la requête SQL. Il serait beaucoup plus rapide de ne pas rouvrir la base de données à chaque fois (self.db_source?) Et de ne pas rouvrir le fichier XML à chaque fois. Ouvrir le même fichier en mode 'w' effacera aussi son contenu à chaque fois. – teambob

0
  1. Annulez le filetage.

  2. Exécutez le profiler sur le code non thread d'origine.

  3. Remplacez l'activité AODB par ODBC ordinaire.

  4. Exécutez le nouveau code via le profileur.

  5. Postez vos résultats pour poursuivre la discussion.