我需要将巨大的 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/