2009-09-12 3 views
0

Мне нужен совет. У меня есть приложение, которое импортирует 10 000 строк, содержащих имя & адрес из текстового файла в XElements, которые впоследствии добавляются в синхронизированную очередь. Когда импорт завершен, приложение запускает рабочие потоки, которые обрабатывают XElements путем их деинкретизации, делая вызов базы данных, вставляя вывод базы данных в документ запроса и вставляя обработанный документ в очередь вывода. Когда все запросы обрабатываются, очередь вывода записывается на диск как XML-документ.XElement vs Dictionary

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

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

Мысли?

ответ

1

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

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

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

EDIT: Хорошо, так что покупайте больше память не является жизнеспособной. Даже в этом случае у вас на самом деле проблема? Каково влияние этого, возможно, используя больше памяти, чем нужно? Что это такое действительно стоит?

+0

Я на самом деле не с помощью XML, пока я не пишу выход на диск. В этот момент я добавляю XElements из очереди вывода в XDocument и сохраняю его на диск. Что касается памяти, я арендую выделенный сервер.Они взимают 50 долларов США за месяц за дополнительный концерт, который отрывается. Если вы начнете факторинг стоимости в течение года, это действительно добавит. – user135498

+0

UPDATE: я реорганизовал код для использования словаря вместо XElement. Код намного чище, потому что я избегал синтаксического анализа. Мой исходный код обработан на 38 мс на запись. Первая итерация обработанного кода обрабатывается в 45 мс. Я реорганизовал еще один раз, чтобы удалить 2 вызова метода Remove(), а время обработки - до 31 мс. – user135498

0

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

Я бы посмотрел на то, чтобы сделать как можно больше обработки при построении запроса из каждой строки.

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

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

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

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

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;