为什么 PostgreSQL 不解析大型 XML 数据?

Why PostgreSQL is not parsing large XML data?

我想在将大数据移入数据库之前检查 XML 在 PostgreSQL 中的能力。

我有一个简单的测试来检查 PostgreSQL 中的 XML 能力。它适用于 3000000 XML 形成的数据,但不适用于 4000000。

select xml_is_well_formed('<test>' || repeat('월', 3000000) || '</test>');

select xml_is_well_formed('<test>' || repeat('월', 4000000) || '</test>');

这就是我的 XML 能力测试的样子: XML_Test.sh

#### XML capabilities
sql1="select xml_is_well_formed('<test>' || repeat('월', 3000000) || '</test>');"
sql2="select xml_is_well_formed('<test>' || repeat('월', 4000000) || '</test>');"

status="OK:"

ret=$(echo "$sql1" | psql -At -U $user -h $host $db)

if [ "$ret" != "t" ]
then
  status="FAILED:"
fi
echo "  $status XML capability (test 1/libxml): "

status="OK:"

ret=$(echo "$sql2" | psql -At -U $user -h $host $db)

if [ "$ret" != "t" ]
then
  status="FAILED:"
fi
echo "  $status XML capability (test 2/libxml): "

我正在使用 Amazon Linux AMI,我的 PostgreSQL 版本是:9.2.24 并使用默认的 PostgreSQL 配置。

编辑: 我的系统总内存是 32 GB。

运行 下面的命令只是表示测试是否通过:

$ echo "select xml_is_well_formed('<test>' || repeat('월', 4000000) || '</test>')" | psql -At -U USER -h localhost DB
f


$ echo "select xml_is_well_formed('<test>' || repeat('월', 3000000) || '</test>')" | psql -At -U USER -h localhost DB
t

谢谢!

我认为这是对底层 xml 解析器库的限制。

=> SELECT xmlparse(document '<?xml version="1.0"?><test>' || repeat('월', 4000000) || '</test>');
ERROR:  invalid XML document
DETAIL:  line 1: xmlSAX2Characters: huge text node
��월월월월월월월월월월월월월월월월월월월월월월월월월월
                                                                               ^
line 1: Extra content at the end of the document
��월월월월월월월월월월월월월월월월월월월월월월월월월월
                                                                               ^

可能对文本节点或类似节点有 1GB 的限制。

老实说,如果您计划使用多 GB xml 文档,我怀疑您需要一个专用系统而不是通用 RDBMS。