5

csvファイルの値でデータベースを更新しようとしています。コードは次のとおりです。

import MySQLdb as mdb
import sys
import csv

con = None
command = ''
new_name_list = []
old_name_list = []
duplicates = []
update_list = []
file = 'csv_file.csv'
listReader = csv.reader(open(file, 'r'))
for row in listReader:
    new_name_list.append(row)

try:

    con = mdb.connect('localhost', 'root', 'mypassword', 'mydb')
    con.autocommit(True)

    cur = con.cursor()
    cur.execute("SELECT fil_name FROM file WHERE fil_name like 'boy%' and fil_job_id=1")    

    numrows = int(cur.rowcount)

    for i in range(numrows):
        file_name = cur.fetchone()
    old_name_list.append(file_name[0])

    d = dict(new_name_list)

    for n in old_name_list:
        try:
            print n + " has been updated to " +  d[n]
            command = "UPDATE file SET fil_name='" + d[n] + "' WHERE fil_name='" + n + "'"
            cur.execute(command)
        except KeyError:
            duplicates.append(n)

except mdb.Error, e:

    print "Error %d: %s" % (e.args[0],e.args[1])
    sys.exit(1)

finally:    

    if con:    
        con.close()

各プリントが表示されるまでに約2〜3秒かかります。そのため、更新の実行が遅いと思います。更新する値がたくさんありますが、これは実行する速度ではないはずです(のすべての値をすばやく印刷できた場合d[n]

とにかく更新をスピードアップする方法はありますか?

編集:データベースはInnoDBエンジンを使用しています

4

2 に答える 2

8

あなたは使用してみることができますexecutemany

data = [(n, d[n]) for n in old_name_list]
cur.executemany("UPDATE file SET fil_name='%s'  WHERE fil_name='%s'", data)

さらに、fil_nameのインデックス作成を検討することもできます(fil_nameがほとんど読み取られていると仮定します)

于 2012-06-14T01:20:56.777 に答える
3

あなたの説明によると、各印刷には2〜3秒かかるので、おそらくこれの問題だと思います:

  1. テーブルファイルのfil_name列にインデックスが付けられていますか?
  2. auto_commitをtrueにすると、各更新はコミットされたトランザクションです。

ケースが1の場合は、その列にインデックスを作成するだけで、更新時にテーブルスキャンを実行しないでください。

ケースが2の場合、@daveは良い答えを出します。

于 2012-06-14T02:18:34.730 に答える