AutoIt Fehler: Error allocating memory.

  • Hallo an alle,

    bekomme beim einlesen (_FileReadToArray) eines 2,5 GB großen log-files folgende fehlermeldung:

    Code
    ---------------------------  AutoIt  ---------------------------  Error allocating memory.  ---------------------------  OK  ---------------------------


    kann man das irgendwie beeinflussen, bzw. vergrößern?

    danke

  • was meinst du mit beeinflussen bzw. vergrößern ??
    Das bedeutet dass sich das Programm beendet weil sonst dein Arbeitsspeicher überläuft :)
    2,5 GB ist für autoit einfach zuviel zum auslesn

  • also arbeitsspeicher hab ich genug, da mach dir mal keine sorgen :)

    kann aber ja auch die datei nicht splitte, weil dazu muss ich die datei ja auch anpacken... keiner ne idee?

  • Hallo Oliver.

    Wie ist diese LogDatei aufgebaut?

    Wäre es z. B. okay, wenn nach jeder 5.000 Zeile die Datei geteilt wird?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Ich frage mich, wie man eine so große Log-Datei habe kann und dann nicht weiß wie man die so hin bekommt, das man damit arbeiten kann.
    Also ich habe ein programm das heißt "schneiden" und damit kann man das doch zurecht schneiden. Digital versteht sich !

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Ich frage mich, wie man eine so große Log-Datei habe kann und dann nicht weiß wie man die so hin bekommt, das man damit arbeiten kann.
    Also ich habe ein programm das heißt "schneiden" und damit kann man das doch zurecht schneiden. Digital versteht sich !

    2,5 gb ist noch gar nichts... das war meine testdatei... es handelt sich um die log datei meines squid proxies über den annähernd 500 user surfen ;)

    aufsplitten hab ich mir auch schon überlegt, aber hab keine entsprechende funktion gefunden. werd das ganze dann wohl in c++ schreiben. autoit ist mir hierfür einfach zu lahm :P

    Zitat

    Und es gibt auch noch FileReadLine, wenn FileRead zu kompliziert ist...

    also zu kompliziert sind die funktionen nicht, aber sehr langsam hehe

  • werd ich nachher mal testen, dankeschön... also fileread liefert schonmal den selben fehler :P

  • okay, ich versuchs glaub doch nicht :P ist mir n bisschen zu hoch glaub ich... im beispiel stehen irgendwelche sachen von dllstructures etc. da komm ich leider noch nicht mit...

    Oscar , kannst du mir vielleicht ein beispiel geben, wie ich es anwenden muss?!?

  • werd ich nachher mal testen, dankeschön... also fileread liefert schonmal den selben fehler :P


    Du darfst eben nicht komplett einlesen...
    Sondern immer in z.B. Blöcken von 5000 Zeichen.

    [autoit]

    $hFile = FileOpen("test.log",0)
    While 1
    $read = FileRead($hFile, 5000)
    If @error <> 0 Then ExitLoop
    WEnd
    FileClose($hFile)

    [/autoit]
  • das funktioniert so nicht ganz... ich muss wenn dann auf zeilen beschränken können nicht nach zeichen... sonst schneidet er mr das ja irgendwo mitten drin ab...

    • Offizieller Beitrag

    Also die WinApi-Funktion ist auf jeden Fall recht schnell. Allerdings kann ich bei mir nicht mehr als 240.000.000 Bytes auf einmal einlesen.
    Hier mal ein Beispielscript:

    [autoit]


    #include <WinAPI.au3>
    Global $nBytes
    Global $BufferSize = 240000000 ; Anzahl der einzulesenden Bytes (größer als 240.000.000 geht bei mir nicht)
    $tBuffer = DllStructCreate("byte[" & $BufferSize & "]")
    $hFile = _WinAPI_CreateFile('test.log', 2, 2)
    _WinAPI_SetFilePointer($hFile, 1) ; hier den Anfang des einzulesenden Bereichs setzen (ab Byte 1)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tBuffer), $BufferSize, $nBytes)
    _WinAPI_CloseHandle($hFile)
    $sText = BinaryToString(DllStructGetData($tBuffer, 1))
    MsgBox(0,0,StringLen($sText))
    $tBuffer = 0

    [/autoit]


    Ich habe mir eine ca. 3GB große Datei in "test.log" umbenannt, zum testen. So wie das Script jetzt ist, funktioniert es. Erhöht man die $BufferSize allerdings auf z.B. 250.000.000 dann gibt's eine Fehlermeldung.