使用批量插入的peewee非常慢进入sqlite db

the*_*ope 3 python sqlite performance database-performance peewee

我正在尝试使用peewee对sqlite数据库进行大规模批量插入.我正在使用,atomic但性能仍然很糟糕.我在〜2500行的块中插入行,由于SQL_MAX_VARIABLE_NUMBER,我一次插入大约200行.这是代码:

with helper.db.atomic():
   for i in range(0,len(expression_samples),step):
      gtd.GeneExpressionRead.insert_many(expression_samples[i:i+step]).execute()
Run Code Online (Sandbox Code Playgroud)

列表expression_samples是一个字典列表,其中包含GeneExpressionRead模型的相应字段.我已经定时了这个循环,执行时需要2-8秒.我有数百万行要插入,现在我编写代码的方式可能需要2天才能完成.根据这篇文章,我设置了几个pragma以提高性能.对于我来说,这也没有真正改变任何表现.最后,根据peewee github页面上的这个测试,应该可以非常快地插入很多行(在0.3364秒内大约50,000个),但似乎作者使用原始的sql代码来获得这种性能.有没有人能够使用peewee方法做这么高性能的插入?

编辑:没有意识到peewee的github页面上的测试是针对MySQL插入的.可能适用于或不适用于这种情况.

col*_*fer 5

莫比乌斯试图在评论中提供帮助,但那里有很多错误的信息.

  • Peewee在创建表时为外键创建索引.这适用于当前支持的所有数据库引擎.
  • 打开外键PRAGMA会减慢速度,为什么会这样呢?
  • 为获得最佳性能,请不要在批量加载的表上创建任何索引.加载数据,然后创建索引.这对数据库来说要少得多.
  • 如您所述,禁用批量加载的自动增量会加快速度.

其他信息:

  • 使用PRAGMA journal_mode = wal;
  • 使用PRAGMA synchronous = 0;
  • 使用PRAGMA locking_mode = EXCLUSIVE;

这些是加载一堆数据的一些好设置.查看sqlite文档以获取更多信息:

http://sqlite.org/pragma.html