Kopiergeschwindigkeit drosseln

  • Hi,
    ich habe ein Script was fertige TV Aufnahmen vom TV-Server auf meinen Arbeitsrechner verschiebt sobald beide Rechner gleichzeitig an sind. Leider lastet das normale Filemove dabei das Netzwerk und (komischerweise) den Arbeitsrechner dermaßen aus das ein weiterarbeiten während des Kopierens fast unmöglich ist. Wenn sich wieder einmal, so wie jetzt, mehrere Gigabyte angesammelt haben ist hier erstmal für längere Zeit Pause angesagt.
    Daher die Frage, kennt jemand eine Möglichkeit die Kopiergeschwindigkeit zu drosseln?
    Wenn nicht per AutoIt, dann von mir aus auch über Batch. Ungerne nehme ich auch Hinweise über 3.Party Anwendungen entgegen in die ich mich erst wieder einarbeiten muss (rsysnc?).
    Danke

  • Klingt interessant, hättest du ein Beispiel für mich wie man Daten schrittweise einliest?
    Ich hab nämlich keine Idee wie das gehen soll.

    Edit: Bisher hab ich das hier auf die Reihe bekommen:

    Ein normales Filemove dauert mit dieser Testdatei ca 3 Sekunden. Mit Filewrite schon ohne das Sleep ca 20 Sekunden. Sieht schrecklich ineffektiv aus, aber könnte genau das sein was ich in diesem Fall brauche. Ich probier das morgen mal im Netzwerk aus, danke

    6 Mal editiert, zuletzt von Gofel (22. November 2014 um 02:34)

  • Irgendwoher hab ich mal aus diesem Forum ein Script gefunden, weiss aber den Link dazu nicht mehr oder wer dieses Script geschrieben hat.

    [autoit]

    #RequireAdmin
    ;~ $Quelle = @SystemDir & '\taskmgr.exe'
    ;~ $Ziel = "C:\taskmgr.exe"
    If _ProgressCopy($Quelle, $Ziel) Then MsgBox(0,"", "Kopiervorgang erfolgreich!")

    [/autoit][autoit][/autoit][autoit]

    Func _ProgressCopy($SourceFile, $DestinationFile)
    If Not FileExists($SourceFile) Then Return SetError(1,1,0)
    If $SourceFile == $DestinationFile Then Return SetError(2,2,0)
    #region------------------------------------Declare Variables-------------------------------
    Local $ByteBlock, $Counter
    Local Const $BlockSize = Int(FileGetSize($SourceFile) / 99)
    Local Const $Opt = Opt("GUIOnEventMode", 0)
    Local $OpenHandle = FileOpen($SourceFile, 16)
    Local $WriteHandle = FileOpen($DestinationFile, 26)
    #endregion---------------------------------------------------------------------------------
    If $OpenHandle = -1 Or $WriteHandle = -1 Then Return SetError(3,3,0)
    #region------------------------------------GUI create--------------------------------------
    Local $GUI = GUICreate('', 400, 105, Default, Default, 0x80880000)
    Local $Label1 = GUICtrlCreateLabel($SourceFile, 8, 10)
    Local $Label2 = GUICtrlCreateLabel($DestinationFile, 8, 30)
    Local $Label3 = GUICtrlCreateLabel("0%", 360, 25, 30, 20, 0x2)
    Local $Button = GUICtrlCreateButton("Abbrechen", 160, 75, 80)
    Local $PBar = GUICtrlCreateProgress(8, 50, 384, 20)
    GUISetState()
    #endregion---------------------------------------------------------------------------------
    #region----------------------------------Copy File-----------------------------------------
    Do
    $ByteBlock = FileRead($OpenHandle, $BlockSize)
    If @error Then ExitLoop
    FileWrite($WriteHandle, $ByteBlock)
    $Counter += 1
    GUICtrlSetData($PBar, $Counter)
    GUICtrlSetData($Label3, $Counter & ' %')
    If GUIGetMsg() = $Button Then
    Opt("GUIOnEventMode", $Opt)
    FileClose($OpenHandle)
    FileClose($WriteHandle)
    GUIDelete($GUI)
    FileDelete($DestinationFile)
    Return SetError(4,4,0)
    EndIf
    Sleep(20) ;Bremse - Auskommentieren für maximale Geschwindigkeit
    Until 0
    #endregion---------------------------------------------------------------------------------
    Opt("GUIOnEventMode", $Opt)
    FileClose($OpenHandle)
    FileClose($WriteHandle)
    GUIDelete($GUI)
    Return 1
    EndFunc

    [/autoit]
  • Sehr schön, natürlich viel eleganter als mit Trim rumzueiern. leider versteh ich nicht warum es funktioniert :whistling:
    Die Schleife durchläuft:

    Code
    $ByteBlock = FileRead($OpenHandle, $BlockSize)

    $BlockSize ist doch aber eine Konstante, nach meinem Verständnis wird hier immer wieder der selbe Teil von $OpenHandle in $ByteBlock eingelesen.??

    Wie auch immer, sobald ich das verstehe verwende ich diese Variante. Danke auch dir.

  • Zitat

    $BlockSize ist doch aber eine Konstante, nach meinem Verständnis wird hier immer wieder der selbe Teil von $OpenHandle in $ByteBlock eingelesen.??

    Nein eben nicht. Wenn du dir das Beispiel zu fielread in der Hilfe anschaust wirst du sehen, dass bei jedem erneuten Lesen aus der noch offenen Datei immer die nächsten X Zeichen/Byte gelesen werden solange bis fileread einen Fehler meldet (End of file). Das funktioniert allerdings nur wenn man mit filehandles (fileopen) arbeitet und die Datei "geöffnet" bleibt. Sobald die Datei geschlossen wird (fileclose) werden zukünftige Leseversuche wieder beim ersten Zeichen/Byte anfangen. Bedeutet also wenn man statt einem Handle einen Dateipfad an fileread in der Schleife übergibt kann man so tatsächlich immer nur den gleichen Anfangsteil auslesen, da fileread in diesem Fall automatisch ein fileopen und fileclose durchführt.

  • Hatte heute keine Zeit zum schauen, aber danke für die Erklärung. So läßt sich eine schöne Lösung zum drosseln der Geschwindigkeit basteln.

    Edit: Ich wollte nur nochmal Rückmeldung geben, die von bbm1995 gepostete Funktion ist in mein Script eingebaut und läßt sich ganz fein über das Sleep regulieren. Kommentiert man das Sleep ganz aus ist die Kopiergeschwindigkeit gleichwertig zu einem FileCopy, schönes Ding!

    Einmal editiert, zuletzt von Gofel (24. November 2014 um 18:00)