我有一个传统的二进制文件格式,包含我们必须转换的记录,并以XML格式提供给系统的其他部分。为了了解数据大小,单个文件最多可达50兆,其中包含50,000或更多记录。我必须处理的XML转换将这个特定的文件打了20倍到几乎一个演出。
(不可思议)使用gzip压缩文件会使文件大约150 Mb,因此存在大量冗余。
但我们必须以XML形式提供的是作为较大文件一部分的单个记录。这些记录中的每一个都非常小。随机访问记录是必需的。记录本身包含各种不同的字段,因此没有非常大的表格就没有元素到列的映射。
由于系统的其他部分使用postgresql数据库,我们正在考虑将每个单独的XML节点存储为数据库中的一行。但我们想知道存储方式效率如何低效?
<xml>
<record><complex_other_xml_nodes>...<record>
<record>...<record>
<record>...<record>
<record>...<record>
<record>...<record>
</xml>
或者我们应该不评估XML数据库(或其他东西)?哦,我们不需要在转换后更新或更改XML,这些遗留记录是静态的。
答案 0 :(得分:4)
由于XML的一个缺点,将数据存储到数据库更有效:每个元素都有元数据。因此,仅包含一个整数值的行可能包含超过十个字符,仅用于描述该值。 XML非常冗长。如果将数据存储在数据库中,则该值将存储在自身中,并将元数据保存在作为模式的位置中。
答案 1 :(得分:3)
由于数据是静态的,从不(或很少)更改,您可以采用不同的方法,将50,000多个XML格式的“记录”预生成到50,000多个静态文件中,然后使用这些静态文件提供Apache(或更好:lighttpd或nginx)。这是优化网站的一种非常常见的技术。如果要更改原始数据文件,可以根据需要重新生成这些静态文件。
请注意,您可以通过将传入的HTTP请求负载平衡到两台或多台静态内容服务器计算机来获得高可用性和可伸缩性,每台计算机都有自己的数据副本。您还可以通过在Web服务器前使用HTTP反向代理缓存来获得可伸缩性。
但老实说,一个千兆字节不像以前那样,你可以简单地创建一个PostgreSQL表来保存这些50,000多个预先生成的XML块,无论你的行索引是什么键入的。
答案 2 :(得分:0)
首先,您可能希望将值存储在单个列中而不使用XML标记来节省大量空间。然后,您可以构建一个选择' <record>'||column_name||'</record>'||chr(10)
的简单视图。为了获得整个XML文档,我建议使用连接函数(我来自Oracle背景,所以我不确定它是如何在Postgresql中完成的),它将单列游标作为输入,并输出整个结果作为一个连接字符串。然后你可以连接<xml>
和</xml>
标签,这样做很好。
答案 3 :(得分:0)
具有适当索引的数据库存储很可能总是对随机访问更快,但可能需要花费很多精力将记录拆分为各自的数据元素。也许在中间相遇并将整个记录存储在一个基于您将用于查询数据的唯一标识符键入的数据字段中。
如果您只是想尝试“修剪”xml文件并控制模式 - 这就像让节点名称为单个字符或两个字符一样简单,过去为我节省了大量带宽/文件大小,当然,权衡是xml的可读性消失了。
B'/ P>