Linq to Xml, держать XDocument загруженным? - PullRequest
3 голосов
/ 14 ноября 2011

Допустим, я делаю программу WinForms, которая будет использовать XML-документ за кулисами в качестве механизма сохранения ...

Каковы плюсы / минусы двух следующих подходов ...

  1. Загрузка XDocument в каждом вызове метода:

    public class XmlFoosRepository
    {
        string xmlFileName;
    
        public XmlFoosRepository(string xmlFileName)
        {
            this.xmlFileName = xmlFileName;
        }
    
        public int AddFoo(Foo foo)
        {
            var xDoc = XDocument.Load(xmlFileName); // Always call Load()
    
            // ...
    
            xDoc.Save(xmlFileName);
            return foo.ID;
        }    
    
        public IEnumerable<Foo> GetFoos()
        {
            var xDoc = XDocument.Load(xmlFileName); // Always call Load()
    
            // ...
    
            return foos;
        }
    }
    

или

  1. Сохраните XDocument впамять ...

    public class XmlFoosRepository
    {
        XDocument xDoc;
    
        public XmlFoosRepository(string xmlFileName)
        {
            xDoc = XDocument.Load(xmlFileName); // Now in memory
        }
    
        public int AddFoo(Foo foo)
        {
            // ...
    
            xDoc.Save(xmlFileName);
            return foo.ID;
        }
    
        public IEnumerable<Foo> GetFoos()
        {
            // ...
    
            return foos;
        }
    }
    

Ответы [ 4 ]

2 голосов
/ 14 ноября 2011

Первый кажется немного неэффективным, поскольку вы ничего не получаете, загружая XML-документ каждый раз, когда получаете к нему доступ.С опцией 1 вы должны перейти на диск и загрузить файл XML в память, прежде чем получить к нему доступ.Переход на диск является одной из самых дорогостоящих операций, которые вы можете выполнять с современным компьютером, и его следует избегать, насколько это возможно.

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

1 голос
/ 14 ноября 2011

Плюсы на основе файлов: - Хорошо работает между процессами (если требуется) - Сохраняет текущие требования к памяти небольшими (если файл большой, например, более 10 МБ) Минусы на основе файлов: - Медленнее загружается при каждой операции

Плюсы на основе памяти: - Быстрее, нет лишних затрат на повторную сериализацию снова и снова - Проще переносить, если вам потребуется доступ к файлу позже через веб-сервис и т. Д. Минусы на основе памяти: - Требования к постоянной памяти (еслибольшой файл)

Еще одна мысль: если у вас уже есть данные в XML, почему бы просто не использовать их в качестве объектов POCO, а вместо этого повторно сериализовать их в объекты в вашем методе "GetFoos".

1 голос
/ 14 ноября 2011

Возможным недостатком хранения документов в памяти является то, что если у вас нет ухудшающего кэша, эти экземпляры потенциально будут жить вечно.Это не обязательно ужасная вещь, но это то, о чем вы должны подумать в своем дизайне.

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

Тем не менее, вы определенно получаете выгоду от кэша;в зависимости от документа и от того, как часто вы к нему обращаетесь, вам не придется повторно обрабатывать документ в XDocument.Если документы большого размера или вы обращаетесь к ним много раз, то вы сэкономите на этом времени обработки, как вы это делали один раз, и вам больше не придется это делать.

1 голос
/ 14 ноября 2011

Баланс в основном находится между доступом к памяти и файловой системе - если вы собираетесь многократно использовать документ в своем коде, вам не нужно взаимодействовать с файловой системой больше, чем вы хотите ... но еслик нему редко обращаются и он огромен, вам может не потребоваться попадание в память.

Я бы, вероятно, по умолчанию сохранил его в памяти - к тому времени, когда он станет достаточно большим, чтобы попадание в память стало важным,вы все равно можете не использовать XML.

Помимо этих аспектов, в обоих случаях вам необходимо будет рассмотреть модель потоков, требуемую вашим конкретным приложением.

Простов качестве одной точки данных - я использую второй шаблон на веб-сайте C # in Depth для исправлений и т. д., и он работает очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...