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