.net 建议将文件数据存储在字典或列表中,并比较性能
我有一个备份程序,已经在公司内部使用了两年,我希望提高性能 以我的电脑为例: 在我的机器上,生成需要评估的19000个文件的初始列表大约需要7-10秒 然后,将该文件列表与以前在备份位置备份的文件列表进行比较大约需要25-30秒。严格来说,比较是从要备份的系统到以前备份的版本的最后一次修改时间。这样,它只执行增量备份 我最初只存储完整的文件名,然后创建指向该文件的fileinfo链接以获取所需的数据 此后,我创建了一个结构,其中包含我需要的文件中的5个字段,并将列表更改为以完整文件名为键的字典,值就是结构 当我将数据存储在Arraylist、List或Dictionary中时所花费的时间大致相同,因此很明显,比较是一项密集的任务,而不是如何存储数据 我想问你们的问题是字典是否适合我存储的数据类型。所有的完整文件名都是唯一的,我真的不关心排序或备份数据的顺序 下面是一些列表和比较子项的说明,它们似乎最慢:.net 建议将文件数据存储在字典或列表中,并比较性能,.net,list,file-io,dictionary,arraylist,.net,List,File Io,Dictionary,Arraylist,我有一个备份程序,已经在公司内部使用了两年,我希望提高性能 以我的电脑为例: 在我的机器上,生成需要评估的19000个文件的初始列表大约需要7-10秒 然后,将该文件列表与以前在备份位置备份的文件列表进行比较大约需要25-30秒。严格来说,比较是从要备份的系统到以前备份的版本的最后一次修改时间。这样,它只执行增量备份 我最初只存储完整的文件名,然后创建指向该文件的fileinfo链接以获取所需的数据 此后,我创建了一个结构,其中包含我需要的文件中的5个字段,并将列表更改为以完整文件名为键的字典,
- _filelistSRC是在要备份的文件夹中找到的文件列表
- _fileListDES是在备份文件夹中找到的文件列表
- _fileList是一个列表,其中包含自上次备份以来已更改且应备份的文件
- fileInfoS是一种结构,它只包含每个文件所需的信息
- fm是一个具有我使用的常用文件管理方法的类
Joshua字典对我来说似乎很合适,因为它使用散列来存储数据,以便快速获取对象。它是否减少了处理时间?如果有,你担心什么 多久调用一次
FileExists
?如果调用过多,这将是您的限制因素。似乎每次找到以前未备份的文件时,都会调用对文件存在的检查。如果它不在目标文件扫描列表中,我不确定是否每次都需要执行此检查,但我可能有一个很好的理由将其放在其中。我将删除并运行一些测试,看看它是否会造成任何不良影响。因此,使用File.Exists
时为35秒,不使用它时为7秒?对于19000个文件,文件Exists的处理时间为7秒,用于将所有文件读取到列表中,用于进行比较的时间为28秒。关闭FileExists检查后,将所有文件读入列表的处理时间仍为7秒,但比较时间不到一秒。这造成了巨大的不同:)现在看看是否有任何不良影响。非常感谢@Jim Mischel抱歉,我不得不删除我的原始评论,但它从总共35秒增加到了总共7秒。这真是太棒了:)通过将它从Arraylist切换到Dictionary,我看不出处理时间有什么区别,但我跟踪的是调试的秒数,而不是滴答或毫秒数。
For Each _file As KeyValuePair(Of String, fileInfoS) In _FileListSRC
Dim dest As String
Try
Dim fi As fileInfoS = _file.Value
If fi.FullName.Contains(p_UserProfile) Then
dest = fi.FullName.Replace(p_UserProfile & "\", p_BackupLocation)
Else
dest = fi.FullName.Replace(fi.FolderRootName, p_BackupLocation)
End If
If _FileListDES.ContainsKey(dest) Then
If fm.fileLastWriteCompare(fi.LastModified, dest) Then
_FileList.Add(fi.FullName, fi)
_totalSize = _totalSize + fi.Size
End If
Else
If Not fm.FileExists(fi.FullName) Then Continue For
_FileList.Add(fi.FullName, fi)
_totalSize = _totalSize + fi.Size
End If
Catch ex As Exception
End Try
Next