如果每个文件的大小约为 30KB,那么处理约 50,000 个 xml 文件的 VB6 程序的运行速度(就每秒处理的文件数量而言)比每个文件大小约为 4KB 的情况下运行速度快 3 倍是否有意义?如果它确实有意义,我怎样才能加快较小文件的处理速度?
该程序读取每个文件,计算文件的 MD5 哈希值并调用 SQL Server 存储过程来查看具有相同哈希值的文件版本是否已存储在数据库中。如果文件的计算哈希值已经存储在数据库中,则不会进一步处理该文件;该程序只是重复下一个文件。
我一直在测试已经处理到数据库中的大约 50,000 个 xml 文件的批次,所以程序只是循环:获取下一个 xml 文件→</kbd>hash it→</kbd>call Sproc→</kbd>repeat.
我希望该程序在类似大小的小文件批次上运行得更快,但速度要慢得多。
该程序在 64 位 Windows 10 工作站上运行。这些文件存储在工作站的 C:\ 驱动器(SSD)上的单个目录中。SQL Server 在 Windows Server 下的 VM 上运行。
编辑:
我想我已经找到了瓶颈,但我不知道如何解决它。相关的代码如下。瓶颈是由xDOC.async = False
语句引起的。如果我删除它,我会立即获得 20 倍的速度提升。 但是删除它会导致文档加载失败错误,因为代码显然无法处理异步文件加载。这可以加速吗?
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim xDOC As MSXML2.DOMDocument
Dim xPE As MSXML2.IXMLDOMParseError
Set objFolder = objFSO.GetFolder("C:\These are my XML Files")
For Each objFile In objFolder.Files
Set xDOC = New DOMDocument
xDOC.async = False ("THIS LINE IS THE PROBLEM")
If xDOC.Load(objFile.Path) Then
/* process the file */
Else
Set xPE = xDOC.parseError
With xPE
/* set up objFile.Name failed to load error message */
End With
/* log error details */
Set xPE = Nothing
End If
Set xDOC = Nothing
Next objFile