2011-03-25 57 views
0

我已经设置了一个应用程序来解析每天大约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 
+0

并行处理将需要*更多*内存在这样的任务上,而不是更少。请张贴一些代码。 – 2011-03-25 18:51:33

+0

有没有我应该考虑的选择? – vbNewbie 2011-03-25 19:05:02

+0

有人知道Visual Basic应该能够帮助你。 (我甚至不知道你的工作语言是什么,直到你发布代码为止。) – 2011-03-25 19:10:02

回答

1

像这样的问题是硬盘驱动器本身 - 取决于许多因素,它可以作为一个漏斗,基本上可以同时在驱动器上交互的文件数量。因此,我强烈建议你在.NET v4.0中看看TPL(任务并行库)。这是一个大大简化了处理器“将工作分散到所有可用核心”的行为的框架。我的电脑有双处理器,每个处理器都有4个本地内核(Intel Xeon's @ 3GHz),它给我8个内核。我有一个应用程序,它可以下载约7,800个不同的URL并分析它们的内容。根据它的值发现它会做一些额外的处理然后存储结果。这有点类似于你的情况,我们都共享一个限制资源(对我来说它是网络),我们必须手动分析和评估我们正在使用的文件的内容。

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

看看TPL并计划对代码进行一些更改以最大限度地提高潜在的改进。但是,如果正确完成,回报可能会很棒。

+0

只是为了确保我覆盖所有区域;通过实施并行任务 - 将所有本地和全球使用的变量保持安全而不会被覆盖。 – vbNewbie 2011-03-27 21:01:06

+0

我想拒绝提供答案的诱惑,因为我们没有看到您的代码,但通常由多个线程访问的全局变量需要同步访问。虽然,我只需要稍微修改我的代码以利用TPL,但我使用了Campbell,Johnson,Miller和Toub的Microsoft.NET并行编程。快速简单阅读大量关于代码如何构建以利用TPL的示例。现在,我在任何地方都使用它,并始终相应地设计 – BonanzaDriver 2011-03-28 05:20:53

1

该应用程序是否作为一项服务持续运行,或者是您每天运行一次或几次?如果它不连续运行,你可以尝试一下,并将处理限制在几个并发线程中。

+0

随着输入文件始终创建,它将一直运行,但如果所有文件都在给定时间处理完毕,则它将会休眠。其他人建议创建一个taskfactory来创建作为一个进程执行的任务,但不知道这是如何不同。感谢您的回复 – vbNewbie 2011-03-25 20:38:10