我在Django 1.10/Postgresql 9.4/Pandas 0.19.0上运行了一些测试,得到了以下时间:
分别插入3000行并使用Django ORM从填充的对象获取id:
3200毫秒
插入3000行熊猫
DataFrame.to_sql()
而且不要得到身份证:
774毫秒
使用Django管理器插入3000行
.bulk_create(Model(**df.to_records()))
而且不要得到身份证:
574毫秒
插入3000行
to_csv
到
StringIO
缓冲区和
COPY
(
cur.copy_from()
)而且不要得到身份证:
118毫秒
插入3000行
到csv
和
复制
通过简单的
SELECT WHERE ID > [max ID before insert]
(可能不是线程安全的,除非
复制
把锁放在桌子上防止同时插入?):
201毫秒
def bulk_to_sql(df, columns, model_cls):
""" Inserting 3000 takes 774ms avg """
engine = ExcelImportProcessor._get_sqlalchemy_engine()
df[columns].to_sql(model_cls._meta.db_table, con=engine, if_exists='append', index=False)
def bulk_via_csv(df, columns, model_cls):
""" Inserting 3000 takes 118ms avg """
engine = ExcelImportProcessor._get_sqlalchemy_engine()
connection = engine.raw_connection()
cursor = connection.cursor()
output = StringIO()
df[columns].to_csv(output, sep='\t', header=False, index=False)
output.seek(0)
contents = output.getvalue()
cur = connection.cursor()
cur.copy_from(output, model_cls._meta.db_table, null="", columns=columns)
connection.commit()
cur.close()
性能统计数据都是在一个已经包含3000行在OSX(i7ssd16GB)上运行的表上获得的,使用
timeit
.
我通过分配导入批处理id和按主键排序来获取插入的主键,尽管我并不是100%确定的主键将始终按行的序列化顺序分配给
复制
指挥部-无论哪种意见都会很感激。