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