Zuvor sagte mir ein Kollege, dass die Ausgabe von Tabellendaten im CSV-Format einige Zeit dauern würde, und gab daher einige Ratschläge.
Ich habe die Zeit nicht gemessen, daher hinterlasse ich eine Notiz, die auf einer einfachen Überprüfung der Geschwindigkeit basiert.
-Der Inhalt der Tabelle wird unverändert ausgegeben. ・ PostgreSQL 12.1
Für die vorbereiteten Daten haben wir 10 Millionen Daten vorbereitet, die sich durch die folgenden IDs unterscheiden.
-[ RECORD 1 ]--------
id | 1
data1 | aiueo
data2 | kakikukeko
data3 | sasshisuseso
data4 | tachitsuteto
data5 | naninuneno
data6 | hahihuheho
data7 | mamimumemo
data8 | yayuyo
data9 | rarirurero
data10 | wawon
Die Ausgabemethode 1 besteht darin, alle Daten zu erfassen und im Programm in das CSV-Format zu konvertieren.
SQL
select * from demo
Ausgabecode
csv_out.py
import psycopg2
import time
def get_connection():
return psycopg2.connect("host=localhost port=5432 dbname=sampledb user=postgres password=postgres")
path = "csv1.csv"
with get_connection() as conn:
with conn.cursor() as cur:
start = time.time()
cur.execute("select * from demo")
exec_time = time.time() - start
print(exec_time)
start = time.time()
with open(path, "w") as f:
i = 1
for row in cur:
csv = ''
for data in row:
csv = csv + str(data) + ','
f.write(csv[:-1] + '\n')
if i % 1000 == 0:
f.flush()
i += 1
exec_time = time.time() - start
print(exec_time)
Es ist eine Methode zum Konvertieren in das SQL-Format mit SQL.
SQL
select
id | ',' |
data1 | ',' |
data2 | ',' |
data3 | ',' |
data4 | ',' |
data5 | ',' |
data6 | ',' |
data7 | ',' |
data8 | ',' |
data9 | ',' |
data10 as data
from demo
Ausgabecode
csv_out2.py
import psycopg2
import time
def get_connection():
return psycopg2.connect("host=localhost port=5432 dbname=sampledb user=postgres password=postgres")
path = "csv2.csv"
with get_connection() as conn:
with conn.cursor() as cur:
start = time.time()
cur.execute("select id || ',' || data1 || ',' || data2 || ',' || data3 || ',' || data4 || ',' || data5 || ',' || data6 || ',' || data7 || ',' || data8 || ',' || data9 || ',' || data10 as data from demo")
exec_time = time.time() - start
print(exec_time)
start = time.time()
with open(path, "w") as f:
i = 1
for row in cur:
for data in row:
f.write(data + '\n')
if i % 1000 == 0:
f.flush()
i += 1
exec_time = time.time() - start
print(exec_time)
Die Ergebnisse sind wie folgt.
wird bearbeitet | Ausgabemethode 1 | Ausgabemethode 2 |
---|---|---|
SQL | 11.68s | 13.35s |
Dateiausgabe | 56.95s | 15.05s |
Ausgabemethode 2 konnte schneller ausgeben.
Persönlich dachte ich, es wäre etwas schneller, aber es könnte so sein, weil die Anzahl der Ausgabespalten gering ist. Je mehr Spalten Sie ausgeben, desto effektiver ist sie.
Wenn Sie eine Verbindung zu einem DB-Server herstellen und CSV ausgeben, können der Befehl Export und der Befehl COPY TO meiner Meinung nach schneller ausgegeben werden. Bei der Wartung und Entwicklung von Geschäftssystemen ist der Prozess der Ausgabe von Tabellendaten jedoch relativ häufig, so dass diese Methode in solchen Fällen verwendet wird.