2009-08-28 9 views
0

私は初心者pythonスクリプトです。私はmsaccessデータベースレコードを読み込み、XMLファイルに書きたい。 アクセスデータベーステーブルには20000を超えるレコードがあります。スレッドはPythonで

これで4分から5分かかります。だから私はスレッドの概念を実装します。しかし、糸通しは5〜6分以上かかる。各スレッドはテーブルからレコードを読み込み、データソースを閉じます。

問題の解決方法はわかりません。

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

ここにコードスニペットを貼り付けてください。 –

+1

プロファイラを使用して時間の所在を確認しましたか?私は時間の80%がJetとのODBC接続にあると確信しています。いくつかの事実を収集するためにプログラムをプロファイリングできますか? –

答えて

5

述べたように、あなたのコードスニペットを貼り付けてください。最初のスレッドには同期オーバーヘッドがあり、マルチスレッドの実行が遅くなります。

第2 - msaccess/JETデータベースは非常に遅く、マルチスレッドの使用にはあまり適していません。代わりにSQL Serverを検討することをお勧めします.SQL Server Expressは無料です。

第3 - おそらく処理を遅くするデータベースです。どのようなインデックスがありますか?どのような質問をしていますか? 「説明する」とは何ですか?

+4

+1:スレッドはI/Oバウンドプログラムを「魔法のように」速くすることはありません。 –

+0

コードを送信していただきありがとうございます。私はすぐにいくつかの問題を見ることができます。 self.devは使用されていません。おそらく、SQLクエリのWHERE句でself.devを使用したいと思うでしょう。毎回データベースを再オープンしない(self.db_source?)と、毎回XMLファイルを再オープンしない方がずっと速いでしょう。同じファイルを 'w'モードで開くと、毎回その内容が消去されます。 – teambob

0
  1. スレッドの処理を元に戻します。

  2. profilerを元のスレッド化されていないコードで実行します。

  3. 通常のODBCでAODBビジネスを置き換えます。

  4. 新しいコードをプロファイラで実行します。

  5. さらなる議論のために結果を投稿してください。

関連する問題