XElement против словаря - PullRequest
       9

XElement против словаря

0 голосов
/ 12 сентября 2009

Мне нужен совет. У меня есть приложение, которое импортирует 10000 строк, содержащих имя и адрес из текстового файла в XElements, которые впоследствии добавляются в синхронизированную очередь. Когда импорт завершен, приложение порождает рабочие потоки, которые обрабатывают XElements, отменяя их, делая вызов базы данных, вставляя вывод базы данных в документ запроса и вставляя обработанный документ в очередь вывода. После обработки всех запросов очередь вывода записывается на диск в виде документа XML.

Я использовал XElements для запросов, потому что мне нужно было гибко добавлять поля в запрос во время обработки. Т.е. в зависимости от типа работы приложение может потребовать, чтобы оно добавило номер телефона, дату рождения или адрес электронной почты к запросу на основе совпадения имени / адреса с базой данных общедоступных записей.

Мои вопросы есть; Кажется, что XElements использует довольно много памяти, и я знаю, что существует много синтаксического анализа, поскольку документ пробивается через методы обработки. Я подумываю заменить XElements объектом Dictionary, но я скептически отношусь к тому, что выигрыш будет стоить усилий. По сути, это будет сделано то же самое.

Мысли

Ответы [ 2 ]

1 голос
/ 12 сентября 2009

То есть вы на самом деле не используете какой-либо XML как таковой? Вы просто используете XElement как набор пар имя / значение? Если это так, я бы определенно использовал словарь. Я ожидаю, что ваш код также может оказаться чище.

С другой стороны, если вы действительно используете XML, вы, вероятно, захотите придерживаться XElement.

Есть ли у вас проблема ? Вы говорите, что он использует довольно много памяти - у вас достаточно памяти? Не могли бы вы купить больше памяти? Это почти наверняка будет дешевле, чем потратить даже несколько часов на рефакторинг, если только ради экономии памяти. (Похоже, это приложение запускается только на одном компьютере - я могу ошибаться. Чем шире оно развернуто, тем больше, вероятно, имеет смысл потратить некоторое время на его оптимизацию.)

РЕДАКТИРОВАТЬ: Хорошо, поэтому покупка большего количества памяти на самом деле не является жизнеспособным. Тем не менее, у вас действительно есть проблема? Какое влияние это, возможно, использует больше памяти, чем нужно? Сколько это действительно стоит вам?

0 голосов
/ 12 сентября 2009

Использование LINQ может иметь смысл, если вы избежите необходимости хранить все дерево перед его использованием.

Я бы посмотрел на максимально возможную обработку при построении запроса из каждой строки.

Затем вы берете результаты запроса и затем обрабатываете их, сохраняя результат в базе данных.

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

Вы можете найти это полезным: http://www.onedotnetway.com/tutorial-reading-a-text-file-using-linq/

Возьмите результаты вашего запроса, выполните цикл for для каждого клиента и сохраните запись:

var query =
        from c in
            (from line in File.ReadAllLines(filePath)
             let customerRecord = line.Split(',')
             select new Customer()
                 {
                     Firstname = customerRecord[0],
                     Lastname = customerRecord[1],
                     PhoneNumber = customerRecord[2],
                     City = customerRecord[3],
                     Country = customerRecord[4]
                 })
        where c.Country == "UK"
        select c;
...