программная логика для ускорения обработки - PullRequest
0 голосов
/ 25 марта 2011

Я настроил приложение для анализа около 3000 файлов в день, каждый из которых содержит около 4000-5000 сообщений в формате xml с примерно 100 полями. Это требует много очистки и разбора, но в среднем это занимает около 6 секунд на пост. Теперь я попытался создать многопоточность, но из-за того, что у меня все настроено с перезаписью переменных и т. Д. Я разделил файлы на разные папки и просто создал копии программы для запуска и доступа к назначенной папке. Он работает на сервере Windows 2008 с 16 ГБ памяти, и мне сказали, что мне нужно перепрограммировать, чтобы ускорить процесс, а также не использовать слишком много памяти. У кого-нибудь есть какие-либо предложения или этот процесс, который я настроил, кажется нормальным? Я новый парень, и буквально все думают, что я идиот.

 For i As Integer = 0 To fileLists.Count - 1
                   Do
                Try
                  If Not completeList.Contains(fileLists(i).ToString) AndAlso fileLists(i).EndsWith("xml") Then

                        If fileLists(i).Contains("Fa") Then 
                            inputFile = New StreamReader(fileLists(i))
                            data = String.Empty
                            infile = fileLists(i).ToString
                            swriter.WriteLine(infile.ToString)
                            swriter.Flush()
                            Dim objFileInfo As New FileInfo(fileLists(i))
                            fileDate = objFileInfo.CreationTime
                              Dim length As Integer = objFileInfo.Length
                                data = inputFile.ReadToEnd
                                If Not data Is Nothing Then
                                    parsingTools.xmlLoad(data)
                                    tempList.Add(fileLists(i))
                                    completeList.Add(fileLists(i))
                                End If
                                inputFile.DiscardBufferedData()
                            End If
                        End If
                    End If

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

        manager.AddNamespace("x", "http://www.w3.org/2005/Atom")
        manager.AddNamespace("a", "http://activitystrea.ms/spec/1.0/")
        Dim nodecount As Integer = xmlParser.getNodesCount(navigator, "x:entry", manager)
        For i As Integer = 1 To nodecount
            statid = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:id", manager)
            contentDate = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:published", manager)
            template = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:title", manager)
            title = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:source/x:title", manager)
            ctext = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:summary", manager)
            htext = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/a:object/x:content", manager)
            author = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:author/x:name", manager)
            authorUri = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/x:author/x:uri", manager)
            avatarUrl = xmlParser.XPathFind(navigator, "x:entry[" & i & "]/a:author/x:link[@rel='avatar']/@href", manager)
        Next

Ответы [ 2 ]

1 голос
/ 26 марта 2011

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

С учетом вышесказанного я настоятельно рекомендую вам взглянуть на TPL (библиотека параллельных задач) в .NET v4.0. Это основа, которая значительно упрощает процесс «распределения работы по всем доступным ядрам» ваших процессоров. Мой компьютер имеет два процессора, каждый из которых имеет 4 собственных ядра (Intel Xeon's @ 3GHz), что дает мне 8 ядер. У меня есть приложение, которое загружает из сети ~ 7800 различных URL-адресов и анализирует их содержание. В зависимости от значений, которые он находит, он выполнит некоторую дополнительную обработку, а затем сохранит результаты. Это несколько похоже на вашу ситуацию в том, что мы оба совместно используем ограничивающий ресурс (для меня это сеть), и нам приходится вручную анализировать и оценивать содержимое файлов, с которыми мы работаем.

Моя программа обрабатывала все эти файлы в среднем от 26 до 30 минут (в среднем). Это было использование правильно реализованного многопоточного приложения. Переключение кода на TPL теперь занимает всего 5 минут. ОГРОМНОЕ улучшение.

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

1 голос
/ 25 марта 2011

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

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