[PYTHON] Eine kleine Geschichte, die Tabellendaten im CSV-Format mit hoher Geschwindigkeit ausgibt

Artikelinhalt

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.

Annahme

-Der Inhalt der Tabelle wird unverändert ausgegeben. ・ PostgreSQL 12.1

Vorbereitete Daten

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

Ausgabemethode 1

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)                

Ausgabemethode 2

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)

Ausgabeergebnis

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.

Impressionen

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.

Recommended Posts

Eine kleine Geschichte, die Tabellendaten im CSV-Format mit hoher Geschwindigkeit ausgibt
Skript zum Herunterladen von AWS RDS-Protokolldateien mit hoher Geschwindigkeit
[Große Abfrage] Laden Sie einen Teil der BQ-Daten mit hoher Geschwindigkeit in Pandas
Eine Geschichte, von der ich bei np.where süchtig war
Beispiel für das Aggregieren einer großen Menge von Zeitreihendaten mit Python in einer kleinen Speicherumgebung mit einer angemessenen Geschwindigkeit
[Python] Erstellen eines GUI-Tools, das die CSV von Temperaturanstiegsdaten in Excel automatisch verarbeitet
Ich habe versucht, mit Docker einen Dienst aufzubauen, der maschinell erlernte Daten mit explosiver Geschwindigkeit verkauft
Veröffentlichung einer Bibliothek, die Zeichendaten in Python-Bildern verbirgt
Erstellen Sie einfach eine GCP-Umgebung für Kaggle mit hoher Geschwindigkeit
Berechnung der impliziten Volatilität mit hoher Geschwindigkeit durchführen (Marktdatenverarbeitung)
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
[Python] Artikel, der eine schnelle Berechnung der Sparse-Matrix ermöglicht
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert