Une petite histoire qui produit des données de table au format CSV à grande vitesse

Contenu de l'article

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.

supposition

-Le contenu du tableau est affiché tel quel. ・ PostgreSQL 12.1

Données préparées

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

Méthode de sortie 1

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)                

Méthode de sortie 2

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)

Résultat de sortie

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.

Impressions

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

Une petite histoire qui produit des données de table au format CSV à grande vitesse
Script pour télécharger les fichiers journaux AWS RDS à grande vitesse
[Big Query] Chargez une partie des données BQ dans les pandas à grande vitesse
Une histoire à laquelle j'étais accro chez np.where
Exemple d'agrégation d'une grande quantité de données de séries temporelles à l'aide de Python dans un petit environnement de mémoire à une vitesse raisonnable
[Python] Création d'un outil GUI qui traite automatiquement le CSV des données d'élévation de température dans Excel
J'ai essayé de créer un service qui vend des données apprises par machine à une vitesse explosive avec Docker
Publication d'une bibliothèque qui masque les données de caractères dans les images Python
Créez facilement un environnement GCP pour Kaggle à grande vitesse
Effectuer des calculs de volatilité implicite à grande vitesse (traitement des données de marché)
Créez le code qui renvoie "A et prétendant B" en python
[Python] Article qui permet le calcul rapide de matrices éparses
Un script python qui convertit les données Oracle Database en csv