Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为sqlite编写合适的大数据加载器_Python_Sqlite_Python 2.7 - Fatal编程技术网

Python 如何为sqlite编写合适的大数据加载器

Python 如何为sqlite编写合适的大数据加载器,python,sqlite,python-2.7,Python,Sqlite,Python 2.7,我正在尝试将loader写入sqlite,以尽可能快地加载DB中的简单行。 输入数据看起来像是从postgres DB检索到的行。将进入sqlite的行的大致数量:从20mil到100mil。 由于项目限制,我无法使用sqlite以外的其他数据库 我的问题是: 编写这种加载程序的正确逻辑是什么? 首先尝试我尝试编写一组封装的生成器,它将从Postgres中取出一行,稍微放大它并将其放入sqlite中。最后,我为每一行创建了单独的sqlite连接和游标。这看起来太多了 在第二次尝试时,我将sqli

我正在尝试将loader写入sqlite,以尽可能快地加载DB中的简单行。 输入数据看起来像是从postgres DB检索到的行。将进入sqlite的行的大致数量:从20mil到100mil。 由于项目限制,我无法使用sqlite以外的其他数据库

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

首先尝试我尝试编写一组封装的生成器,它将从Postgres中取出一行,稍微放大它并将其放入sqlite中。最后,我为每一行创建了单独的sqlite连接和游标。这看起来太多了

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

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

我还考虑过处理事务:每次将行推送到Sqlite时,在生成器中调用一个连接、一个游标、一个事务和commit。我走这条路对吗


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

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

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

  • 问题:您是否控制SQLite数据库?您可以根据缓存大小等进行调整。您也可以根据自己的目的进行调整

  • 总的来说,《1》中的步骤会给你带来最大的回报。

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

    连接一次,在一个事务中执行最大工作量,然后提交。性能将取决于目标表上的索引数。“第二次尝试”仅在8小时内处理1206072行。太慢了。我有一个perl脚本,可以在不到24小时的时间内完成类似100mil行的操作。然而,它不将它们插入SQLite,只存储在内存中,这就是为什么我认为SQLite部分是瓶颈的原因。如果可能的话,我需要用perl或者更快的方式来完成。我最多有近48小时来提取数据。@Daniel:将数据提交到带有索引的数据库总是比内存操作慢。2 Martijn你认为我应该慢多少?比如说sqlite比内存慢2(3或4倍)?丹尼尔:这完全取决于索引、表格布局、行的大小等。对数据子集进行一些测试并进行推断。2 Martijn。谢谢最后,最严重的瓶颈是sqlite中的插入。