Arbeitsspeicher freigeben?!?

  • Hi,
    hab mir ma nen Suchscript gebastelt:

    [autoit]

    Dim $SuchVerzeichnis = @HomeDrive, $Max = 1

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

    Search($SuchVerzeichnis, $Max)

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

    For $i = 1 To 10000
    For $i = 1 To $Max
    Search(Eval($i),$Max)
    ConsoleWrite(Eval($i)& @CR)
    Next
    Next

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

    ConsoleWrite('+> '&$Max&@CRLF&@CRLF)

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

    Func Search($SuchVerzeichnis, $i = 1)
    Dim $FirstFile = FileFindFirstFile($SuchVerzeichnis & '\*')
    Do
    $Name = FileFindNextFile($FirstFile)
    If @error Then ExitLoop
    If Not StringInStr($Name, '.') Then
    Assign($i, $SuchVerzeichnis & '\' & $Name, 2)
    $i = $i + 1
    EndIf
    Until 0
    $Max = $i
    EndFunc ;==>Search

    [/autoit]


    Das Problem ist nur der Arbeitsspeicherverbrauch, der da schnell ma auf 500 mb geht :rofl:
    Wie kann ich den Arbeitsspeichjer wieder Freigeben?
    lg PCeumel

    Einmal editiert, zuletzt von pceumel (27. August 2011 um 20:25)

  • Hallo pceumel,

    teste diese Funktion:

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ReduceMemory
    ; Author ........: w_Outer, Rajesh V R, Prog@ndy
    ; ===============================================================================================================================
    Func _ReduceMemory($iPid = -1)
    If $iPid = -1 Or ProcessExists($iPid) = 0 Then
    Local $ai_GetCurrentProcess = DllCall('kernel32.dll', 'ptr', 'GetCurrentProcess')
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'ptr', $ai_GetCurrentProcess[0])
    Return $ai_Return[0]
    EndIf

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

    Local $ai_Handle = DllCall("kernel32.dll", 'ptr', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $iPid)
    Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'ptr', $ai_Handle[0])
    DllCall('kernel32.dll', 'int', 'CloseHandle', 'ptr', $ai_Handle[0])
    Return $ai_Return[0]
    EndFunc ;==>_ReduceMemory

    [/autoit]

    mfg autoBert

  • $FirstFile muss am Ende der Suche mit FileClose geschlossen werden, wenn du das nicht machst, wird durch EmptyWorkingSet zwar der Arbeitsspeicherverbruach geringer, aber der Platz in der Auslagerungsdatei bleibt belegt.

    Spoiler anzeigen
    [autoit]

    Func Search($SuchVerzeichnis, $i = 1)
    Dim $FirstFile = FileFindFirstFile($SuchVerzeichnis & '\*')
    Do
    $Name = FileFindNextFile($FirstFile)
    If @error Then ExitLoop
    If Not StringInStr($Name, '.') Then
    Assign($i, $SuchVerzeichnis & '\' & $Name, 2)
    $i = $i + 1
    EndIf
    Until 0
    FileClose($FirstFile)
    $Max = $i
    EndFunc ;==>Search

    [/autoit]
  • Hallo,
    ich wollt nur mal anmerken das die Funktion '_ReduceMemory' die von Autobert vorgeschlagen wurde zwar ganz gut funzt, ABER der Speicherverbrauch wird ausschliesslich vom RAM in die Auslagerungsdatei verlegt. Wenn dein Script viele, viele Stunden läuft kann das zu Problemen und Abstürzen führen.

    Grüsse!