Как я могу сделать свою программу более отзывчивой?(программа, которая загружает не менее 200 файлов) - у меня может быть 1 идея - PullRequest
0 голосов
/ 29 декабря 2010

первый - я хочу извиниться за мой убитый английский.

Я создаю программу, которая использует много файлов. У меня есть много циклов foreach, которые проходят через жесткий диск и эти файлы (по крайней мере, 200 файлов - 600 байт каждый файл в среднем), цикл использует XPath для поиска значений в файле (файлы, конечно, являются файлами XML)

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

Спасибо заранее ... Дин

если кто-то не понимает мой английский, я попытаюсь объяснить снова

Ответы [ 5 ]

2 голосов
/ 29 декабря 2010

Лучший подход, о котором я думаю, это PLINQ в C # 4.0 . Сгруппируйте эти XML-файлы и запросите их параллельно с LINQ-to-XML. Ниже приведен простой пример, который загружает все XML-файлы в C: \ xmlFolder и выбирает те документы, которые содержат элемент с именем «key».

List<XDocument> xmls = Directory.EnumerateFiles(@"C:\XmlFolder").AsParallel()
                          .Select(path => XDocument.Load(path))
                          .Where(doc => doc.Descendants()
                                           .Any(ele => ele.Name.Equals("key")))
                          .ToList(); 
0 голосов
/ 29 декабря 2010

Используйте BackgroundWorker или ThreadPool, чтобы порождать несколько потоков для ввода-вывода, а затем считывать данные в очередь (это предполагает, что общий размер ваших данных не слишком велик).Пусть другой поток (ы) считывает эту очередь и выполняет внутреннюю логику xPath, чтобы извлечь из этих файлов все, что вам нужно.

По сути, рассматривайте его как пример шаблона проектирования «производитель / потребитель» , в котором потоки считывателя ввода-вывода являются производителями, а логические потоки XPath - потребителями.1006 * Тип объекта в очереди может быть просто байтовым массивом, но я бы предложил пользовательский класс C #, который содержит байтовый массив, а также некоторые метаданные файла на тот случай, если вам это понадобится по какой-либо причине.

0 голосов
/ 29 декабря 2010

Определите «отзывчивый». Вы имеете в виду, что вы хотите, чтобы сигналы интерфейса продолжали происходить, или чтобы вы могли продолжать выполнять другие действия в интерфейсе пользователя во время его обработки файлов?

Первый вариант прост, вы можете просто добавить случайные Application.DoEvents() в свои петли. Это побудит пользовательский интерфейс выполнить любые ожидающие сигналы (например, нарисовать окно и т. Д.).

Последний будет включать многопоточность. Окунуться в это немного сложнее, чем можно научить в параграфе или в двух, но некоторые поиски в Google по «многопоточному учебнику по c # .net» должны дать массу результатов. Если вы не знакомы с базовой концепцией многопоточности, я могу объяснить ее подробнее.

0 голосов
/ 29 декабря 2010

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

Если у вас есть только файлы XML, вы можете использовать собственные базы данных XML или, если у вас есть и другие типы, вы можете использовать DBMLS с поддержкой XML (например, Oracle или DB2).

0 голосов
/ 29 декабря 2010

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

...