程序逻辑加快处理速度

时间:2011-03-25 18:46:12

标签: vb.net memory-management parallel-processing

我已经设置了一个应用程序,每天解析大约3000个文件,每个文件包含大约4000-5000个xml格式的帖子,包含100个字段。 它涉及大量的清理和解析,但平均每个帖子大约需要6秒。现在我尝试了线程,但由于我设置了所有设置的变量被覆盖等...我已经将文件分成不同的文件夹,只是创建程序的副本来运行和访问指定的文件夹。它运行在具有16 G内存的Windows 2008服务器上,我被告知我需要重新编程以加快进程并且也不会使用如此多的内存。 有没有人有任何建议或这个过程我设置似乎没问题?我是新人,实际上每个人都认为我是个白痴。

 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文档中,如果失败,则使用普通文本解析对其进行解析。它导航到我需要提取的每个字段,并连接到几个Web服务以获取更多内容,然后将所有内容添加到一起以创建新的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 个答案:

答案 0 :(得分:1)

应用程序是作为服务连续运行还是每天运行一次/或几次?如果它没有连续运行,你可以尝试并将处理限制为几个并发线程。

答案 1 :(得分:1)

类似这样的问题是硬盘驱动器本身 - 取决于许多因素,它可以充当漏斗并且基本上限制了您能够同时在驱动器上与之交互的文件数量。

话虽如此,我强烈建议您查看.NET v4.0中的TPL(任务并行库)。它是一个框架,可以极大地简化处理器“在所有可用内核之间传播工作”的行为。我的电脑有双处理器,每个处理器有4个本机核心(Intel Xeon的@ 3GHz),它给我8个核心。我有一个应用程序可以从网上下载〜7,800个不同的URL,并分析它们的内容。根据它找到的值,它将执行一些额外的处理,然后存储结果。这有点类似于你的情况,因为我们共享一个限制资源(对我而言,它是网络),我们必须手动解析和评估我们正在使用的文件的内容。

我的程序过去需要花费26到30分钟(平均)来处理所有这些文件。这是使用正确实现的多线程应用程序。通过将代码切换到TPL,现在只需要5分钟。一个巨大的进步。

查看TPL并计划对代码进行一些更改,以便最大限度地提高潜在的改进。但是,如果做得好,收益可能会非常好。