我目前正在分析维基百科转储文件;我使用 python 从中提取大量数据并将其保存到 PostgreSQL 数据库中。我总是试图让事情进展得更快,因为这个文件很大(18GB)。为了与 PostgreSQL 交互,我使用 psycopg2,但该模块似乎模仿了许多其他此类 DBAPI。
无论如何,我有一个关于cursor.executemany(command,values);的问题在我看来,每 1000 个值执行一次executemany 比对这 500 万个值中的每一个值调用cursor.execute(command % value) 更好(请确认或更正我!)。
但是,你看,我正在使用executemany 将 1000 行插入到具有唯一完整性约束的表中;这个约束没有事先在 python 中验证,因为这要么要求我一直进行 SELECT(这似乎适得其反),要么要求我获得超过 3 GB 的 RAM。所有这些都表明,当我的脚本尝试通过捕获 psycopg2.DatabaseError 来插入已经存在的行时,我指望 Postgres 发出警告。
当我的脚本检测到这样的非唯一插入时,它会使用connection.rollback()(每次都会生成1000行,这使得executemany毫无价值),然后一一插入所有值。
由于 psycopg2 的文档记录很差(许多很棒的模块也是如此......),我找不到高效且有效的解决方法。我已将每次执行插入的值数量从 1000 减少到 100,以减少每次执行非唯一插入的可能性,但我非常确定它们是告诉 psycopg2 忽略这些异常或告诉 psycopg2 的一种方法。光标继续执行。
基本上,这似乎是一种解决方案如此简单和流行的问题,我所能做的就是询问以了解它。
再次感谢!
只需使用 psql \copy 命令将所有数据复制到临时表中,或使用 psycopgcursor.copy_in() 方法。然后:
insert into mytable
select * from (
select distinct *
from scratch
) uniq
where not exists (
select 1
from mytable
where mytable.mykey = uniq.mykey
);
这将比任何插入组合进行重复数据删除并且运行速度更快。
-dg
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)