xml - Postgres : Importing huge XML files

标签 xml database postgresql import

我需要将巨大的 XML 文件导入数据库。之后,我需要将其转换为另一种格式。

目前我尝试使用 Postgres 来做到这一点。

我已经使用

将一个 250 MB 的文件导入到一个表中
insert into test
(name, "element")
SELECT 
     (xpath('//title/text()', myTempTable.myXmlColumn))[1]::text AS name
     ,myTempTable.myXmlColumn as "element"
FROM unnest(
    xpath
    (    '//test'
        ,XMLPARSE(DOCUMENT convert_from(pg_read_binary_file('test.xml'), 'UTF8'))
    )
) AS myTempTable(myXmlColumn)
;

但是对于更大的文件(我尝试了一个 > 1 GB 的文件,我得到了

SQL Error [22023]: ERROR: requested length too large ERROR: requested length too large ERROR: requested length too large

我的目标是导入和转换大小约为 50 GB 的文件。

有什么建议/替代方案吗?

更新:

这个想法不是将 1GB 的文件导入一个字段。上面的代码能够在我的机器上以 3m 57s 的速度将我的 250MB 文件加载和取消嵌套到 1773844 行中。我认为这还不错。导入文件后,我可以相对快速地转换数据,因为 Postgres 擅长于此。

有什么更好的主意吗?

最佳答案

您是否尝试过 \COPY + UNNEST 的组合?

使用中间表..

CREATE TABLE tmp_tb (tmp_xml XML);

使用psql 执行导入..

cat huge.xml | psql db -c "\COPY tmp_tb (tmp_xml) FROM STDIN;"

加载 XML 后,您可以在内部解析它..

INSERT INTO tb (test) 
SELECT UNNEST(XPATH('//test',tmp_xml)) FROM tmp_tb

关于xml - Postgres : Importing huge XML files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48901180/

相关文章:

c# - 使用强类型 XSD 反序列化 XML 文档时出错

xml - if else 对于 ant 脚本

php - 如何使用 php 更改 ms sql server 2014 中的表

postgresql - Docker Postgres镜像无法访问

sql-server - 以 XML 或 SQL 格式存储数据?

java - 使用 XStream 将 XML 转换为 Java Map<String, Integer>

mysql - MySQL 中按外键依赖性排序的表名列表

sql - 在 SQL 中,如何为表的 future INSERT 语句添加约束?

sql - 获取相关表中每行的前 5 行

ruby-on-rails - 在 heroku 上管理数据库索引