の更新をスピードアップするために私は私のディスク上に.db
ファイルとして格納するデータベースを、持っています。 sqlite3
を使用してこのデータベースを管理するために必要なすべての機能を実装しました。しかし、私はテーブルの行を更新するには時間がかかります。私のデータベースは現在608042行あります。データベースには1つのテーブルがあります - Table1
としましょう。このテーブルには、次の列からなる:パイソン:sqlite3の - どのようにデータベース
id | name | age | address | job | phone | income
(id
値がautomaticaly生成される行がデータベースに挿入された状態)。 は読取のすべての行後、私はそれぞれ608042のために、私は(行ごとに)このようincome
(の値を更新する必要が次の行からの値に(収入を予測するためのMLアルゴリズム)いくつかの操作を行い、行は私がSQL update
操作を実行します)。 更新するために、私は(私のクラスからコピーされた)次の関数使用しています:
def update_row(self, new_value, idkey):
update_query = "UPDATE Table1 SET income = ? WHERE name = ?" %
self.cursor.execute(update_query, (new_value, idkey))
self.db.commit()
をそして私は、データベースに登録されたそれぞれの人のために、この関数を呼び出します。
for each i out of 608042 rows:
update_row(new_income_i, i.name)
(new_income_iの値はiごとに異なります)。 データセットが巨大ではないにもかかわらず、これには膨大な時間がかかります。データベースの更新を高速化する方法はありますか? sqlite3
以外のものを使用する必要がありますか?または、データベースを.dbファイルとして保存する代わりに(sqlite3.connect(":memory:")
を使用して)メモリに格納する必要がありますか?
'name'カラムにインデックスを作成しようとしましたか、あるいは' id'を使ってそれらのレコードを更新しようとしましたか? 'name'が各行に対して一意であれば、' name'列にユニークなインデックスを作成することもできますが、 'id'を使うのは文字列以外の数値なので高速でなければならないと思います。 –
@JoeyZhang Idは一意ですが、名前は必ずしも必要ではありません。このインデックスが何をしているのか、それがどのように役立つのかを少し教えてください。 – Ziva
「データベースのインデックス作成の仕組み」を参照してください。 https://stackoverflow.com/questions/1108/how-does-database-indexing-work –