Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 建议将文件数据存储在字典或列表中,并比较性能_.net_List_File Io_Dictionary_Arraylist - Fatal编程技术网

.net 建议将文件数据存储在字典或列表中,并比较性能

.net 建议将文件数据存储在字典或列表中,并比较性能,.net,list,file-io,dictionary,arraylist,.net,List,File Io,Dictionary,Arraylist,我有一个备份程序,已经在公司内部使用了两年,我希望提高性能 以我的电脑为例: 在我的机器上,生成需要评估的19000个文件的初始列表大约需要7-10秒 然后,将该文件列表与以前在备份位置备份的文件列表进行比较大约需要25-30秒。严格来说,比较是从要备份的系统到以前备份的版本的最后一次修改时间。这样,它只执行增量备份 我最初只存储完整的文件名,然后创建指向该文件的fileinfo链接以获取所需的数据 此后,我创建了一个结构,其中包含我需要的文件中的5个字段,并将列表更改为以完整文件名为键的字典,

我有一个备份程序,已经在公司内部使用了两年,我希望提高性能

以我的电脑为例:

在我的机器上,生成需要评估的19000个文件的初始列表大约需要7-10秒

然后,将该文件列表与以前在备份位置备份的文件列表进行比较大约需要25-30秒。严格来说,比较是从要备份的系统到以前备份的版本的最后一次修改时间。这样,它只执行增量备份

我最初只存储完整的文件名,然后创建指向该文件的fileinfo链接以获取所需的数据

此后,我创建了一个结构,其中包含我需要的文件中的5个字段,并将列表更改为以完整文件名为键的字典,值就是结构

当我将数据存储在Arraylist、List或Dictionary中时所花费的时间大致相同,因此很明显,比较是一项密集的任务,而不是如何存储数据

我想问你们的问题是字典是否适合我存储的数据类型。所有的完整文件名都是唯一的,我真的不关心排序或备份数据的顺序

下面是一些列表和比较子项的说明,它们似乎最慢:

  • _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