VB.net并行读取大型XML文件

问题描述 投票:0回答:1

故事:我有一个大约70+ GB的大XML文件,我每周需要解析一次到我的数据库中。目前,我在vb.net中使用XmlReader运行了解析器。我目前正在以大约5.000节点/秒的速度达到最大值,并且> 10.000.000节点并不断增加,这需要一段时间才能完成。该程序使用普通的SSD在车库中我自己的服务器上运行。我认为限制因素是SSD,因此我最近升级到了三星EVO 970 M.2 SSD,其读/写速度提高了6倍。问题是我没有看到任何明显的性能提升。回顾一下,很明显瓶颈在其他地方。

想法:我开始调查。我实现了2个独立的线程,每个线程都从头开始读取文件,相距几秒钟。每个线程仍然读取和处理约5.000个节点/秒,因此现在我有效地处理了10.000个节点/秒。但是问题是我将每个节点解析两次,这消除了目的。下一个想法是让一个线程从头开始读取和处理数据。第二个线程也将从文件的开头读取,但是在开始处理数据之前,该线程将仅跳过文件的前半部分。使用XMLReader.ReadToNextSibling(),我能够以10.000个节点/秒的速率“跳过” 6.250.000个节点。从本质上讲,这意味着第一个线程在第二个线程完成“跳过”并从中的6.250.000个节点开始解析时将处理大约3.125.000个节点。这时,大约有6.875.000个节点在两个线程之间分配。从那时起,将有2个线程,解析器将以大约10.000个节点/秒的速度进行处理。本质上,我想增加线程数量,直到遇到另一个瓶颈。这种方法非常原始,“浪费”大量时间来读取和跳过相同的节点。我尝试了XmlReaderSettings.LineNumberOffset,但是我无法使它正常工作,而且无论偏移量如何,它似乎总是从头开始读取。

Dim settings = New Xml.XmlReaderSettings()
settings.LineNumberOffset = 100000

Dim XMLReader = Xml.XmlReader.Create("C:\largexml.xml", settings)

问题:关于并行读取大型XML文件以及可能出现的瓶颈或优化的任何想法。有没有比像这样使用ReadToNextSibling更快的“跳过” n个元素的方法?

Dim Count As Integer = 0
While Count < 5000000
   XMLReader.ReadToNextSibling("ns")
   Count += 1
End While

我已经对当前的“跳过”解决方案进行了som计算,并且由于我必须在每个线程中读取相同的数据,因此速度奖励会渐近+ 50%速度提升。如果有人遇到相同的问题并且正在考虑类似的天真解决方案,则这是图表。这是预期的性能提升/线程。

enter image description here

故事:我有一个大约70+ GB的大XML文件,我需要每周一次解析到我的数据库中。目前,我在vb.net中使用XmlReader运行了解析器。我目前正在以大约5.000个节点/ ...

xml vb.net xmlreader
1个回答
0
投票

看看下面的代码是否更快。 XElement.ReadFrom()读取同级,所以它只读取一次。在代码运行时,在任务管理器中检入内存使用情况。如果内存不足,则使用磁盘上的交换空间,这实际上会使应用程序变慢。

© www.soinside.com 2019 - 2024. All rights reserved.