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