Многократное сохранение большого XML-файла в PUGIXML занимает много времени

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

2

Решение

Это старый вопрос. Но в любом случае, позвольте мне ответить.
В 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]