≈105 Sekunden pro 1 Million Zeilen in PostgreSQL lokalen Datenbank in Tabelle mit 2 Indizes und 4 Spalten einzufügen ist es langsam oder schnell?Einfügen von Daten in PostgreSQL aus Python
Python-Code:
import os
import pandas as pd
from concurrent.futures import ThreadPoolExecutor, as_completed
from sqlalchemy import create_engine
num = 32473068
batch = 1000000
def main(data):
engine = create_engine('postgresql://***:****' + host + ':5432/kaggle')
data.to_sql(con=engine, name=tbl_name, if_exists='append', index=False)
for i in range(0, num, batch):
data = pd.read_csv(data_path+'app_events.csv', skiprows=i, nrows=batch)
data.columns = ['event_id', 'app_id', 'is_installed', 'is_active']
data = data.reset_index(drop=True)
batchSize = 10000
batchList = [data.iloc[x:x + batchSize].reset_index(drop=True) for x in range(0, len(data), batchSize)]
with ThreadPoolExecutor(max_workers=30) as executor:
future_to_url = {executor.submit(main, d): d for d in batchList}
for k, future in enumerate(as_completed(future_to_url)):
url = future_to_url[future]
Postgres hat einen speziellen Befehl zum Importieren von CSV-Dateien 'COPY' - nichts sollte schneller sein. –
pg_bulkload ist eigentlich schneller – d1ll1nger
Zusätzlich zu @ user2189731 ist hervorragende Punkt über die Aktivierung ** use_batch_mode = True ** in Ihrer SQLAlchemy in Ihrer Engine Instanziierung Ich würde vorschlagen, dass Sie Multi-Threading für diese Aufgabe überspringen. Das ist unwahrscheinlich, dass es eine vorteilhafte Nebenläufigkeit bietet und verliert wahrscheinlich weit mehr, um die Konkurrenz zu sperren, als Sie gewinnen würden. –