Auparavant, un collègue m'avait dit que la sortie des données de table au format CSV prendrait du temps, j'ai donc donné quelques conseils.
Je n'ai pas mesuré le temps, je vais donc laisser une note basée sur une simple vérification de la vitesse à laquelle il sera.
-Le contenu du tableau est affiché tel quel. ・ PostgreSQL 12.1
En ce qui concerne les données préparées, nous avons préparé 10 millions de données qui diffèrent par les identifiants suivants.
-[ RECORD 1 ]--------
id | 1
data1 | aiueo
data2 | kakikukeko
data3 | sasshisuseso
data4 | tachitsuteto
data5 | naninuneno
data6 | hahihuheho
data7 | mamimumemo
data8 | yayuyo
data9 | rarirurero
data10 | wawon
La méthode de sortie 1 consiste à acquérir toutes les données et à les convertir au format CSV dans le programme.
SQL
select * from demo
Code de sortie
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)
C'est une méthode pour convertir au format SQL avec SQL.
SQL
select
id | ',' |
data1 | ',' |
data2 | ',' |
data3 | ',' |
data4 | ',' |
data5 | ',' |
data6 | ',' |
data7 | ',' |
data8 | ',' |
data9 | ',' |
data10 as data
from demo
Code de sortie
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)
Les résultats sont les suivants.
En traitement | Méthode de sortie 1 | Méthode de sortie 2 |
---|---|---|
SQL | 11.68s | 13.35s |
Sortie de fichier | 56.95s | 15.05s |
La méthode de sortie 2 a pu produire plus rapidement.
Personnellement, je pensais que ce serait un peu plus rapide, mais cela peut être comme ça car le nombre de colonnes de sortie est petit. Plus vous produisez de colonnes, plus ce sera efficace.
Si vous vous connectez à un serveur DB et que vous sortez CSV, je pense que la commande Exporter et la commande COPY TO peuvent produire plus rapidement. Cependant, dans la maintenance et le développement de systèmes d'entreprise, le processus de sortie des données de table telles quelles est relativement courant, cette méthode est donc utilisée dans de tels cas.
Recommended Posts