python - 通过 python/psycopg2 将 XML 转换为 Postgres

标签 python xml postgresql csv

我有一个现有的 python 脚本,它循环遍历 XML 文件目录,使用 etree 解析每个文件,并使用 psycopg2 模块将不同点的数据插入到 Postgres 数据库模式中。这个 hacked together 脚本工作得很好,但现在数据量(XML 文件的数量和大小)正在快速增长,而 INSERT 语句的数量只是没有增加。我最终数据库中最大的表已经从大约 200,000 个 XML 文件增长到大约 5000 万条记录。所以我的问题是,最有效的方法是:

  1. 从 XML 中解析数据
  2. 组装行
  3. 向 Postgres 插入行

以正确的格式将所有数据写入 CSV,然后使用 COPY_FROM 命令将最终的 CSV 表批量加载到 Postgres 会更快吗?

否则我会考虑在内存中填充某种临时数据结构,以便在它达到一定大小时插入到数据库中?我只是无法了解这将如何工作的细节。

感谢您对此主题的任何见解,如果需要更多信息来回答我的问题,请告诉我。

最佳答案

copy_from 是我发现进行批量插入的最快方法。您也许可以通过生成器流式传输数据,从而避免写入临时文件,同时保持较低的内存使用率。

生成器函数可以从 XML 数据中组合行,然后使用 copy_from 使用该生成器。您甚至可能需要多个级别的生成器,这样您就可以拥有一个从单个文件生成记录的生成器,另一个生成器从所有 200,000 个文件中生成记录。您最终会得到一个比 50,000,000 快得多的查询。

我写了一个答案here带有示例和基准代码的链接,用于设置类似的东西。

关于python - 通过 python/psycopg2 将 XML 转换为 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971071/

相关文章:

java - 为什么 postgresql 不使用正确的顺序?

sql - 我可以使用 Postgres 函数在固定大小的旋转矩形内查找点吗?

python - 如何在lxml中编写xml文档的开头?

python - 为什么我们需要 python 包装(例如 egg)?

xml - 从 XML 模板生成 XML 文档

xml - 针对 2 个 XSD 验证简单 XML - XMLCopyEditor

java - JAXB XML 在没有父元素的情况下重复交替 XmlElements

python - 属性“invisible”在 odoo 中不起作用

python - 带字符串的滚动总和

postgresql - 如何强制重启 Cloud SQL