私は以下を使用していますが、これまで見てきた限り、パフォーマンスに影響はありません。
import psycopg2
import psycopg2.extras
local_conn_string = """
host='localhost'
port='5432'
dbname='backupdata'
user='postgres'
password='123'"""
local_conn = psycopg2.connect(local_conn_string)
local_cursor = local_conn.cursor(
'cursor_unique_name',
cursor_factory=psycopg2.extras.DictCursor)
実行時をテストするために、コードで次の出力を作成しました(そして、多くの行を解析しています。30.000.000以上)。
Parsed 2600000 rows in 00:25:21
Parsed 2700000 rows in 00:26:19
Parsed 2800000 rows in 00:27:16
Parsed 2900000 rows in 00:28:15
Parsed 3000000 rows in 00:29:13
Parsed 3100000 rows in 00:30:11
私は何も「コピー」しないことに言及しなければなりません。しかし、私は行をリモートのPostGreSQLからローカルのPostGreSQLに移動しています。その過程で、30.000.000 +は通常のクエリでは処理するには少なすぎるため、データのインデックスを作成するためにさらにいくつかのテーブルを作成します。
注意:時間は上向きにカウントされており、クエリごとではありません。
それは私のcursor
創造の仕方に関係していると思います。
編集1:
私はクエリを実行するために以下を使用しています:
local_cursor.execute("""SELECT * FROM data;""")
row_count = 0
for row in local_cursor:
if(row_count % 100000 == 0 and row_count != 0):
print("Parsed %s rows in %s" % (row_count,
my_timer.get_time_hhmmss()
))
parse_row(row)
row_count += 1
print("Finished running script!")
print("Parsed %s rows" % row_count)
これmy_timer
は私が作成したタイマークラスであり、parse_row(row)
関数はデータをフォーマットし、ローカルDBに転送し、データがローカルDBに移動されたことが確認されると、最終的にリモートDBから削除します。
EDIT2:
約4.000.000のクエリを解析した後でも、DB内の100.000行ごとに解析するのに約1分かかります。
Parsed 3800000 rows in 00:36:56
Parsed 3900000 rows in 00:37:54
Parsed 4000000 rows in 00:38:52
Parsed 4100000 rows in 00:39:50