使用PUGIXML重复保存大型XML文件需要花费大量时间

时间:2013-03-01 23:46:43

标签: c++ pugixml

我有一个65Mb的XML文件,我正在使用PUGIXML加载和修改。问题是我需要保持更新并保存到磁盘,以便其他文件可以访问。我不想实现数据库,所以有没有办法让我进行修改,只需保存那些修改,而不是将整个文档转储到文件中?每次保存xml文件时都会注意到3-4秒的延迟。

1 个答案:

答案 0 :(得分:0)

这是一个老问题。但无论如何,让我回答。 pugixml具有通过write接口保存数据的模式。这有效地解决了必须转储整个文件的问题,因为您可以将数据块化为较小的块并写入文件。

来自documentation

  

这是一个带有单个函数的简单接口,可以调用它   在输出过程中多次将文档数据块作为   输入:

class xml_writer
{
public:
    virtual void write(const void* data, size_t size) = 0;
};

void xml_document::save(xml_writer& writer, const char_t* indent = "\t",
                        unsigned int flags = format_default,
                        xml_encoding encoding = encoding_auto) const;
     

...

     

使用相对较大的块调用write函数(通常是大小)   几个千字节,除了可能很小的最后一个块),所以   在实现中通常不需要额外的缓冲。

还有一种方法可以解决这个问题:一次保存一个子树。同样,来自documentation

  

要保存单个子树,请提供以下功能:

void xml_node::print(std::ostream& os, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
void xml_node::print(std::wostream& os, const char_t* indent = "\t", unsigned int flags = format_default, unsigned int depth = 0) const;
void xml_node::print(xml_writer& writer, const char_t* indent = "\t", unsigned int flags = format_default, xml_encoding encoding = encoding_auto, unsigned int depth = 0) const;
  

这些函数具有相同的参数,其含义与   对应的xml_document :: save函数,并允许您保存   子树到C ++ IOstream或任何实现的对象   xml_writer接口。