【发布时间】:2019-03-09 22:24:50
【问题描述】:
≈105 秒每 100 万行插入到具有 2 个索引和 4 列的表上的 Postgresql 本地数据库中是慢还是快?
Python 代码:
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 有用于导入 CSV 文件的特殊命令
COPY- 没有什么比这更快了。 -
pg_bulkload 实际上更快
-
除了 @user2189731 关于在引擎实例化的 SQLAlchemy 中启用 use_batch_mode=True 的精彩观点之外,我建议您跳过此任务的多线程。这不太可能提供任何有益的并发性,并且可能会因锁定争用而损失比您获得的更多。
标签: python postgresql concurrent.futures