0

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

我的问题是: 编写这样的加载器的正确逻辑是什么?

在第一次尝试时,我尝试编写一组封装的生成器,它将从 Postgres 中取出一行,稍微修改它并将其放入 sqlite。我最终发现,对于每一行,我都创建了单独的 sqlite 连接和游标。这看起来很糟糕。

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

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

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

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

4

3 回答 3

1

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

如果您确实觉得一个事务有问题,为什么不提交任何n事务呢?逐行处理,根据需要插入,但每次n执行的插入都会添加一个connection.commit()以分散负载。

于 2012-12-17T18:00:22.700 回答
0
  1. 请参阅我之前关于 bulk 和 SQLite 的回答可能我的回答也在这里
  2. 一个问题:你控制 SQLite 数据库吗?您可以调整与缓存大小等相关的编译时间选项。您也可以根据自己的目的进行调整。

一般来说,#1 中的步骤将为您带来最大的收益。

于 2012-12-17T21:08:44.903 回答
0

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

于 2012-12-20T16:31:49.913 回答