Что я должен использовать для временного хранения данных XML, которые будут использоваться повторно? - PullRequest
1 голос
/ 24 ноября 2010

У меня есть 47 МБ XML-файл, который мне приходится читать снова и снова в моем приложении, но в большинстве случаев ему нужен только 1 узел, определенный данным термином время от времени.

Пример:

<customers>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>

    ...

    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
</customers>

Итак, я думал о загрузке xml в словарь или список после загрузки программ и сохранения их для повторного использования до закрытия приложения.

  • То, что я хотел знать, что будет лучший тип хранится для него?

Если мне нужно использовать словарь, например:

private Dictionary<int,string> myCustomerList = new Dictionary<int,string>();

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

if (myCustomerList.ContainsKey(keyX))
    myValue = myCustomerList[keyX];
  • Это плохой путь или что? на что мне смотреть?

Ответы [ 4 ]

1 голос
/ 24 ноября 2010

47 МБ - это достаточно большие данные, которые приложение постоянно хранит в памяти.

Однако вы можете комбинировать XmlReader с XNode.ReadFrom для чтения больших Xmls с меньшим объемом памяти.

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

1 голос
/ 24 ноября 2010

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

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

Dictionary - то же самое, что и выше, строго типизируется только через дженерики, такие как Dictionary

, постоянно используют List и Dictionary.

1 голос
/ 24 ноября 2010

Я бы сказал, 47 МБ файла, загрузка всех данных в таблицу данных была бы очень простой, а также полезной для поиска.

Вы должны рассмотреть WeakReferences, чтобы сохранить эти данные в памяти.

1 голос
/ 24 ноября 2010

В вашем подходе нет ничего плохого в функциональном отношении, но что произойдет, когда клиенту будет добавлено больше информации? Например, у вас может быть элемент «location»:

   <customer>
        <id>someid</id>
        <name>somename</name>
        <location>somename</location>
    </customer>

Также рассмотрите сценарий, в котором вы перемещаете свои данные в базу данных - вам придется переписать много кода.

Обычно считается плохой практикой работать напрямую с объектами XML в течение всего времени работы вашего приложения. «Правильный» подход - сначала загрузить данные XML в объектно-ориентированные объекты.

Вы должны создать класс с именем Customer и использовать List<Customer> customers =new List<Customer>() для хранения объектов. Затем вы можете использовать customers.Find(x=>x.Id == myId), чтобы найти ваши объекты.

Помните, что если вы храните ваши объекты в памяти, ваше приложение будет использовать не менее 47 МБ ОЗУ. Это может потенциально расти, поскольку ваш бизнес получает больше клиентов. Возможно, вам стоит посмотреть на ленивую загрузку ваших клиентов (извлекать их из XML-файла, когда они требуются) - это будет медленнее, так что это действительно зависит от ваших требований к пропускной способности и объему.

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