社内で2年間使用しているバックアッププログラムがあり、パフォーマンスの向上を目指しています。
例として私のコンピューターを使用してみましょう:
私のマシンでは、評価する必要のある19,000ファイルの初期リストを生成するのに約7〜10秒かかります。
次に、そのファイルのリストを、バックアップ場所に以前にバックアップされたファイルのリストと比較するのに約25〜30秒かかります。比較は、バックアップされるシステムから以前にバックアップされたバージョンまでの最終変更時刻に厳密に行われます。このようにして、増分バックアップのみを実行します。
私は元々、完全なファイル名を保存し、必要なデータを取得するためにファイルへのfileinfoリンクを作成するだけでした。
その後、必要なファイルから5つのフィールドを持つ構造を作成し、リストを完全なファイル名をキーとして、値が構造である辞書に変更しました。
データをArraylist、List、またはDictionaryに格納する場合にかかる時間はほぼ同じであるため、比較は集中的な作業であり、データの格納方法ではないようです。
皆さんへの私の質問は、私が保存しているデータのタイプに適した辞書です。完全なファイル名はすべて一意であり、データの並べ替えやバックアップの順序はまったく気にしません。
以下は、最も遅くなると思われるリストと比較サブの説明です。
- _filelistSRCは、バックアップするフォルダーで見つかったファイルのリストです。
- _fileListDESは、バックアップフォルダで見つかったファイルのリストです
- _fileListは、最後のバックアップ以降に変更されたファイルを含むリストであり、バックアップする必要があります
- fileInfoSは、各ファイルに必要な情報のみを含む構造です。
- fmは、私が使用する一般的なファイル管理メソッドを持つクラスです。
プライベートサブ比較リスト()
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
助けてくれてありがとう。
ジョシュア