Hallo alle zusammen,
Ich arbeite seit ein Paar tagen an einer Methode mit der man große Dateien schnell kopieren kann sprich schneller als mit der Windows Kopierfunktion, vor allem wenn man mehrere Dateien auf einmal Kopiert bricht bei Windows die Geschwindigkeit zusammen.
Die Dateien haben etwa 7-16GB/Datei und es gibt ca. 40 Dateien.
Mir stellen sich hierbei einige Fragen zur Optimierung des Codes, vor allem würde es mich interessieren ob es eine Mathematische Formel gibt mit der man die Optimale Größe des Puffers ermitteln kann.
Denn wir mir bei Tests aufgefallen ist hat die Größe ja eine große Auswirkung auf die Geschwindigkeit.
Mein Code arbeitet derzeit eine Datei Synchron ab, die frage ist ob es sich lohnen würde auf Asynch E/A zu wechseln und wenn wäre ich für einige Tutorials dankbar denn bei Google hab ich zwar manches gefunden doch das hat mich an dem Sinn von Asynch E/A bei reinen Kopieraktionen zweifeln lassen.
Außerdem stellt sich mir generell die frage was besser ist, das starten mehrerer Kopiervorgänge in verschiedenen Threads oder das Abarbeiten der Dateien nacheinander.
Mein Code sieht bisher so aus:
Edit: Sorry hatte mich schon gewundert.
Ich arbeite seit ein Paar tagen an einer Methode mit der man große Dateien schnell kopieren kann sprich schneller als mit der Windows Kopierfunktion, vor allem wenn man mehrere Dateien auf einmal Kopiert bricht bei Windows die Geschwindigkeit zusammen.
Die Dateien haben etwa 7-16GB/Datei und es gibt ca. 40 Dateien.
Mir stellen sich hierbei einige Fragen zur Optimierung des Codes, vor allem würde es mich interessieren ob es eine Mathematische Formel gibt mit der man die Optimale Größe des Puffers ermitteln kann.
Denn wir mir bei Tests aufgefallen ist hat die Größe ja eine große Auswirkung auf die Geschwindigkeit.
Mein Code arbeitet derzeit eine Datei Synchron ab, die frage ist ob es sich lohnen würde auf Asynch E/A zu wechseln und wenn wäre ich für einige Tutorials dankbar denn bei Google hab ich zwar manches gefunden doch das hat mich an dem Sinn von Asynch E/A bei reinen Kopieraktionen zweifeln lassen.
Außerdem stellt sich mir generell die frage was besser ist, das starten mehrerer Kopiervorgänge in verschiedenen Threads oder das Abarbeiten der Dateien nacheinander.
Mein Code sieht bisher so aus:
VB.NET-Quellcode
- Function copy(ByVal scr As String, ByVal out As String, Optional ByVal buffersize As Long = 8192) As Boolean
- Dim scrf As New IO.FileStream(scr, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
- Dim outf As New IO.FileStream(out, FileMode.Create, FileAccess.ReadWrite, FileShare.None)
- Dim data(buffersize) As Byte
- Dim buffer As Long = 0
- Dim buffercount As Long = 0
- Dim filesize As Long = scrf.Length
- While True
- If buffercount >= filesize - buffersize Then
- ReDim data(filesize - buffercount)
- buffer = scrf.Read(data, 0, filesize - buffercount)
- outf.Write(data, 0, buffer)
- Exit While
- End If
- buffer = scrf.Read(data, 0, buffersize)
- outf.Write(data, 0, buffersize)
- buffercount += buffer
- End While
- Dim MD5 As New MD5CryptoServiceProvider
- Dim Hash As Byte()
- Dim res1 = "", res2 As String = ""
- Dim Tmp As String = ""
- MD5.ComputeHash(scrf)
- Hash = MD5.Hash
- scrf.Close()
- For i As Integer = 0 To Hash.Length - 1
- Tmp = Hex(Hash(i))
- If Len(Tmp) = 1 Then Tmp = "0" & Tmp
- res1 += Tmp
- Next
- MD5.ComputeHash(outf)
- Hash = MD5.Hash
- outf.Close()
- For i As Integer = 0 To Hash.Length - 1
- Tmp = Hex(Hash(i))
- If Len(Tmp) = 1 Then Tmp = "0" & Tmp
- res2 += Tmp
- Next
- If res1 = res2 Then
- Return True
- Else
- Return False
- End If
- End Function
Edit: Sorry hatte mich schon gewundert.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „d3luxee“ ()