【发布时间】:2012-08-20 13:54:24
【问题描述】:
我编写了一个 Python 脚本,它采用 1.5 G XML 文件,解析数据并使用 copy_from 将其提供给数据库。它每 1000 个解析的节点调用以下函数。总共有大约 170k 个节点更新大约 300k 行或更多。它开始时非常快,然后随着时间的推移逐渐变慢。关于为什么会发生这种情况以及我能做些什么来解决它的任何想法?
这是我将数据提供给数据库的函数。
def db_update(val_str, tbl, cols):
conn = psycopg2.connect("dbname=<mydb> user=postgres password=<mypw>")
cur = conn.cursor()
output = cStringIO.StringIO()
output.write(val_str)
output.seek(0)
cur.copy_from(output, tbl, sep='\t', columns=(cols))
conn.commit()
我没有包含 xml 解析,因为我认为这不是问题。如果没有 db,解析器将在 2 分钟内执行。
【问题讨论】:
-
您是否尝试过缓存连接?您还可以通过将
val_str直接传递给StringIO()来稍微简化函数,从而消除write和随后的seek。 -
我是 StringIO() 新手。你能举例说明你的意思吗?可能很愚蠢,但如果我不问......
-
output = cStringIO.StringIO(val_str)是获取包含val_str(适用于copy_from)的只读文件类对象所需的全部操作。基本上,如果你不给它任何参数,你会得到一个读/写文件,但是如果你给它一个字符串参数cStringIO.StringIO会给你一个带有指定内容的只读文件。见cStringIO.StringIO。
标签: python database postgresql psycopg2