Variablengroesse (z.B. FileRead)

  • Hi Ihr alle...

    Ich versuche ein ca. 300MB grosses File zur Stringsuche, wie folgt zu laden:

    $file = FileOpen("xyz.dat",0)
    $chars = FileRead($file)
    ...

    Dabei musste ich feststellen das die Variable nicht das komplette File fasst. Es kommt zum "Error allocating memory". Ich lade das File nun in mehreren "kleineren" Teilen.

    Aber : Wieviel Daten fasst eine Variable unter AutoIt maximal ?

    Besten Dank für Eure Hilfe
    Micha

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Das wären dann 4095 Byte ?! Das kann aber eigentlich nicht sein.

    Zur Zeit lese ich 10MB-Teile und das scheint zu funktionieren.
    Sogar 100MB gingen scheinbar fehlerfrei.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    • Offizieller Beitrag

    Hi!

    "Maximale Länge eines Strings: 2.147.483.647 Zeichen" (aus der Hilfe)

    D.h. die Schwelle sollte wohl da liegen. Wie viele MB das im Einzelfall sind, habe ich nicht im Kopf, aber bei ASCII-Daten solte ein Zeichen 1 Byte brauchen -> 2 GB. Evtl. kann AutoIt aber den Speicher nicht schnell genug allokieren oder ist eben limitiert durch dein System...

    peethebee

  • Hallo!

    Stringsuche in solchen "Dampfhämmern" geht ziemlich langsam:


    Hier mal ein Stück aus Testcode von mir, hab das Teil jetzt auf C umgestellt, da das doch etwas schneller geht (hat mich zwar ne Pizza und nen Kaffee gekostet, da ich Nachhilfe gebraucht habe, aber es war bei 200MB mit autoit einfach zu langsam)

    Stell die Blocksize auf 4096, das war bei meinen Performancetests am schnellsten. (am Beispiel unten sind 2048)


    $hfile= FileOpen($hexfile, 0)
    if $hfile = -1 then
    Return 1
    Exit
    EndIf

    ; Read in 1 character at a time until the EOF is reached
    While 1
    $read=0
    ; $aryChar = FileRead($hfile,1)
    $block = FileRead($hfile,2048)

    If @error = -1 Then ExitLoop

    $aryChar = StringSplit($block, "")
    ; jetzt hab ich das Teil im array

    For $i = 1 To $aryChar[0]
    ; nur Ausgabe wenn Integer Wert
    $asciiwert=asc($arychar[$i])
    if $asciiwert=0 then
    $arychar[$i]=" "
    Endif
    $convstring = $convstring & $arychar[$i]
    Next

    FileWrite($afile, $convstring)
    $convstring=""


    Wend


    ================================

    Gruss

    German
    genannt der INTEGRATOR

  • Das mit 2.147.483.647 Zeichen(Byte) passt scheinbar nicht.
    Ich habe mit einem Test-Script

    eine Variable mit 1k Stücken gefüllt. Egal welcher Rechner, der Fehler kommt immer bei ca. 512 MB.
    Es ist zwar für mein eigentliches Problem nicht mehr wichtig ( ich lese jetzt kleinere Teile des Files ), aber scheinbar passen NUR 512MB in eine Variable.

    Gruß
    Micha

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • mhh konnte die datei max 169 MB groß machen das waren dann 105226948 Zeichen(laut open office) dann hat er gemeckert dass ich nicht genügend arbeitsspeicher am start hab(1024 DDR2)...naja egal mir ist grad langweilig^^