我正在编写一个程序,将数据加载到一个特定的数据库中。这就是我现在正在做的。。。

        conn = psycopg2.connect("dbname='%s' user='postgres' host='localhost'"%dbName)
        cur  = conn.cursor()

        lRows = len(rows)
        i, iN = 0, 1000
        while True:

            if iN >= lRows:
                # write the last of the data, and break ...
                iN = lRows
                values = [dict(zip(header, r)) for r in rows[i:iN]]
                cur.executemany( insertString, values )
                conn.commit()
                break

            values = [dict(zip(header, r)) for r in rows[i:iN]]
            cur.executemany( insertString, values )
            conn.commit()

            i  += 1000
            iN += 1000

        cur.close()
        conn.close()

我知道关于使用COPY命令的this问题。不过,我需要做一些簿记我的文件之前,我可以上传到数据库的文件。因此我以这种方式使用Python。
我有几个关于如何使事情更快的问题。。。
是否最好(或可能)在结尾处做多个cur.executemany()语句和一个conn.commit()语句?这意味着我将在conn.commit()语句之前放置一个cur.close()语句。
我经常看到其他人使用cur.executemany()来批量处理大约1000个记录。通常是这样还是可以对我从文件中读取的整个记录集执行cur.executemany()。我可能会有几十万张唱片,或者超过一百万张。(我有足够的内存来存储整个文件)。我如何知道一次可以上载的记录数的上限。
我正在为我打开的每个文件重新连接到数据库。我这样做是因为,这个过程要花很多天来完成,我不希望与连接的问题损坏整个数据,如果连接在任何时候丢失。我有一千多份文件要查。我们正在建立的这一千个联系是否将成为这个过程所用时间的一个重要部分?
在程序中,是否还有其他我不应该做的事情可以缩短整个过程的总时间?
非常感谢你的帮助。很抱歉这些问题太简单了。我只是从Python中的数据库开始,出于某种原因,我现在似乎没有任何明确的答案来回答这些问题。

最佳答案

正如您在p.3中提到的,您担心数据库连接可能会断开,因此,如果您只在所有插入之后使用一个conn.commit(),那么您可以轻松地松开已插入的数据,但如果连接在conn.commit()之前断开,则不会释放提交的数据。如果每次conn.commit()之后都这样做,就不会丢失所有内容,只会丢失最后一批。所以,这取决于你自己,取决于你需要支持的工作流程。
每批记录的数量是插入速度和其他因素之间的权衡。您需要选择满足您的需求的值,您可以使用1000条记录/批测试脚本,使用10000条记录/批测试脚本并检查差异。
在一个cur.executemany()中插入整个文件的情况有一个原子性的优点:如果它已经被执行,那意味着这个特定文件中的所有记录都已经被插入,所以我们回到p.1。
我认为在你的情况下建立一个新的联系的成本并不重要。比方说,如果建立新的连接需要一秒钟的时间,使用1000个文件,那么在几天内连接需要1000秒的时间。
程序本身看起来不错,但我还是建议您使用cur.executemany()COPY TO表查看UNLOGGED命令,它将真正加快您的导入速度。

关于python - postgres INSERT命令中的速度提高,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39782681/

10-15 23:53