2013-03-01 3 views
2

У меня есть XML-файл размером 65 МБ, который я загружаю и изменяю с помощью PUGIXML. Проблема в том, что мне нужно сохранить ее обновленной и сохраненной на диске, чтобы другие файлы могли получить доступ. Я не хочу реализовывать базу данных, поэтому есть ли способ внести изменения и просто сохранить эти несколько изменений вместо того, чтобы сбрасывать весь документ в файл? Я замечаю о 3-4-секундной задержке каждый раз, когда я сохраняю xml-файл.Сохранение большого XML-файла с PUGIXML неоднократно занимает много времени

ответ

0

Это старый вопрос. Но так или иначе, позвольте мне ответить. pugixml имеет режим сохранения данных через интерфейс write. Это эффективно решает проблему сбрасывания всего файла, так как вы можете обрезать данные на более мелкие части и записать в файл.

Из :

Это простой интерфейс с одной функцией, которая называется несколько раз во время вывода процесса с кусками данных документа в качестве ввода:

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; 

. ..

Функция записи называется относительно большими блоками (размер обычно несколько килограммов байты, за исключением последнего блока, который может быть небольшим), поэтому часто не требуется дополнительная буферизация в реализации.

И еще один способ решить эту проблему: путем сохранения одного поддерева за раз. Опять же, из 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 functions, и вы можете сохранить поддерево либо в C + + IOstream, либо в любой объект, реализующий интерфейс x12_16.