如何将正确的大数据加载器写入sqlite

时间:2012-12-17 17:56:58

标签: python sqlite python-2.7

我正在尝试将加载程序写入sqlite,它将在DB中尽可能快地加载简单行。 输入数据看起来像从postgres DB中检索的行。将转到sqlite的近似行数:从20mil到100mil。 由于项目限制,我不能使用除sqlite之外的其他数据库。

我的问题是: 编写此类加载程序的正确逻辑是什么?

首先尝试我试图编写一组封装的生成器,这将从Postgres中取一行,稍微修改它并将其放入sqlite中。我最终得到的事实是,对于每一行,我创建单独的sqlite连接和游标。这看起来很糟糕。

第二次尝试,我将sqlite连接和光标从生成器移到了脚本的主体,很明显我没有将数据提交到sqlite,直到我获取并处理所有20mils记录。这可能会使我的所有硬件崩溃。

第三次尝试我考虑保持Sqlite连接远离循环,但每次处理并将一行推送到Sqlite时创建/关闭游标。这是更好的,但我认为也有一些开销。

我还考虑过使用事务:每次将行推送到Sqlite时,一个连接,一个游标,一个事务和在生成器中调用的提交。这是我正确的方式吗?

是否有一些广泛使用的模式在python中编写这样的组件?因为我觉得我好像在发明一辆自行车。

3 个答案:

答案 0 :(得分:1)

SQLite可以轻松处理大量事务,为什么最终会提交?你有没有试过这个?

如果您确实感觉某个事务存在问题,为什么不提交n个事务?逐行处理行,根据需要插入,但每个n执行的插入都会添加connection.commit()来分散负载。

答案 1 :(得分:0)

  1. See my previous answer about bulk and SQLitePossibly my answer here as well
  2. 一个问题:您是否控制SQLite数据库?有compile time options您可以调整与缓存大小等相关的内容,您也可以根据自己的需要进行调整。
  3. 一般来说,#1中的步骤将为您带来最大的收益。

答案 2 :(得分:0)

最后我设法解决了我的问题。主要问题是sqlite中插入的数量过多。在我开始将所有数据从postgress加载到内存后,以合适的方式聚合以减少行数,我能够将处理时间从60小时减少到16小时。