我正在尝试将加载程序写入sqlite,它将在DB中尽可能快地加载简单行。 输入数据看起来像从postgres DB中检索的行。将转到sqlite的近似行数:从20mil到100mil。 由于项目限制,我不能使用除sqlite之外的其他数据库。
我的问题是: 编写此类加载程序的正确逻辑是什么?
首先尝试我试图编写一组封装的生成器,这将从Postgres中取一行,稍微修改它并将其放入sqlite中。我最终得到的事实是,对于每一行,我创建单独的sqlite连接和游标。这看起来很糟糕。
第二次尝试,我将sqlite连接和光标从生成器移到了脚本的主体,很明显我没有将数据提交到sqlite,直到我获取并处理所有20mils记录。这可能会使我的所有硬件崩溃。
第三次尝试我考虑保持Sqlite连接远离循环,但每次处理并将一行推送到Sqlite时创建/关闭游标。这是更好的,但我认为也有一些开销。
我还考虑过使用事务:每次将行推送到Sqlite时,一个连接,一个游标,一个事务和在生成器中调用的提交。这是我正确的方式吗?
是否有一些广泛使用的模式在python中编写这样的组件?因为我觉得我好像在发明一辆自行车。
答案 0 :(得分:1)
SQLite可以轻松处理大量事务,为什么不最终会提交?你有没有试过这个?
如果您确实感觉某个事务存在问题,为什么不提交n
个事务?逐行处理行,根据需要插入,但每个n
执行的插入都会添加connection.commit()
来分散负载。
答案 1 :(得分:0)
一般来说,#1中的步骤将为您带来最大的收益。
答案 2 :(得分:0)
最后我设法解决了我的问题。主要问题是sqlite中插入的数量过多。在我开始将所有数据从postgress加载到内存后,以合适的方式聚合以减少行数,我能够将处理时间从60小时减少到16小时。