为什么 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。
我想在将大数据移入数据库之前检查 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。