Eine sehr große Datei lesen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Eine sehr große Datei lesen

20 Sep 2018, 17:11

Hallo,
Wie kann ich eine Datei ca. 250MB groß und 52000 Zeilen lang lesen lassen?
Mit FileRead bekomme ich die Meldung #MaxMem.
Mir geht es darum. Zeilennummer des gesuchten Strings herausfinden,
mit FileReadLine die entsprechende Zeile für weitere Bearbeitung herausfiltern.
LG



Code: Select all

F1::

FileRead, data, xml.xml
mx :=% zeilennr(data, "0331631")

FileReadLine, AusgabeVar, xml.xml, %mx%
msgbox, % AusgabeVar
return

zeilennr(heu, nadel){
Loop, parse, heu, `n, `r
    if RegExMatch(A_LoopField, nadel)
        return A_Index
}
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Eine sehr große Datei lesen

21 Sep 2018, 00:48

Hi KHA,

lt. Hilfe zu Autohotkey - ichfinde gerade den Smilie mit dem Zaunpfahl nicht ;-) - heißt es zu #MaxMem:
#MaxMem Megabytes

Parameter:
Megabytes: Die Menge in Megabyte, die für jede Variable zur Verfügung steht. Ein Wert größer als 4095 wird automatisch auf 4095 zurückgesetzt. Ein Wert kleiner als 1 wird automatisch auf 1 zurückgesetzt.

Ist diese Direktive im Skript nicht angegeben, gilt standardmäßig 64.
VG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Eine sehr große Datei lesen

21 Sep 2018, 01:27

Hallo,
Wenn ich richtig verstehe muss ich in meinem Fall, #MaxMem 250 eingeben, damit sich Kapazität des Variables sich erhöht.
Habe jetzt etwas herumprobiert, doch die Meldung "Error: Memory limit reached (see #MaxMem in the help file)." kommt jedes mal.
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Eine sehr große Datei lesen

21 Sep 2018, 02:08

:arrow: FileRead

Eine Datei größer als 1 GB bewirkt, dass ErrorLevel auf 1 gesetzt und AusgabeVar leer gemacht wird. Wenn aber die *m-Option vorhanden ist, wird nur der führende Teil der Datei geladen.

FileRead ignoriert #MaxMem. Wenn Sie Bedenken haben, dass die Datei zu viel Arbeitsspeicher verbraucht, können Sie zunächst ihre Größe mit FileGetSize überprüfen.

Die FileOpen-Funktion bietet eine weitaus fortschrittlichere Funktionalität als FileRead. Sie kann zum Beispiel Daten an einer bestimmten Stelle in der Datei lesen oder schreiben, ohne zuerst die gesamte Datei in den Arbeitsspeicher lesen zu müssen. Eine Liste aller Features finden Sie unter File-Objekt.
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Eine sehr große Datei lesen  Topic is solved

21 Sep 2018, 02:35

Es macht meiner Meinung nach wenig Sinn, erst die komplette Datei einzulesen, dann nach einer Zeilennummer zu suchen und zuletzt diese Zeile noch einmal zu lesen.

Alternative:

Code: Select all

#NoEnv
Zeile := ""
Nummer := 0
SuchBegriff := "0331631"
Loop, Read, Xml.xml
{
   If RegExMatch(A_LoopReadLine, SuchBegriff) ; je nach Suchbegriff kann auch die schnellere InStr() Funktion reichen
   {
      Nummer := A_Index
      Zeile := A_LoopReadLine
      Break
   }
}
If (Nummer)
   MsgBox, Suchbegriff %SuchBegriff% gefunden in Zeile %Nummer%:`n`n%Zeile%
Else
   MsgBox, Der Suchbegriff %SuchBegriff% wurde nicht gefunden!
Wenn Dir das zu langsam ist, solltest Du Dir das File-Objekt anschauen.
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Eine sehr große Datei lesen

21 Sep 2018, 15:36

@just me
Danke, dein Script ist Super!
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Eine sehr große Datei lesen

02 Oct 2018, 05:52

Also ich lese in einem meiner Scripte ca. 1.5 Millionen Zeilen am Stück in eine Variable ein, die zusammen knapp 1 GB lang sind. Das klappt bisher reibungslos. Man sollte nur sicherheitshalber abfragen, ob die Dateilänge nicht > 2 GB ist und ob genug frier Speicher da ist, um den Text ins Ram zu kopieren, da es sonst zu Fehlern kommt.

Das Suchen von Strings/Teilstrings in Variablen geht überdies 1000x schneller als wenn ich zeilenweise aus der Datei lese.

Gucky.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Eine sehr große Datei lesen

02 Oct 2018, 07:33

Wenn ihr ressourcensparender arbeiten wollt empfiehlt es sich einen Chunk einzulesen.
Das macht ihr zum Beispiel wenn ihr Zeilenweise lest - bringt jedoch das Problem mit sich, dass nach dem Zeilenende gesucht werden muss.
Wenn man stattdessen eine feste Größe (z.B. 20 MB Datei Größe) verwendet sollte dies kein Problem sein.
Recommends AHK Studio
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Eine sehr große Datei lesen

02 Oct 2018, 08:18

Das habe ich mit meinen Dateien seinerzeit so versucht.
Das Problem war, dass ich täglich eine so lange Datei einlese und der Konvertierungsvorgang dabei so lange dauerte, dass sich das nach einigen Tagen so weit aufschaukelte, dass der Rechner irgendwann nie mehr mit den aufgelaufenen Daten fertig wurde.
Seither lese ich die Textdateien in eine Variable ein, was bei zumindest halbwegs modernen Rechnern (4 GB Ram +++) kein Thema sein sollte. Auf (sehr alten) XP Rechnern mit weniger Ram kann sowas natürlich problematisch werden.

Wenn ich aber bedenke, dass die Dateien, die ich täglich einlese und die ca. 1 ... 1.2 Mio Zeilen haben (was schon sehr ordentlich ist) nicht größer als 1 GB sind, dann ist nach oben hin so viel Luft, das ich annehmen will, dass man diese Grenze nicht sooo schnell erreichen wird.

Ansonsten würde ich vielleicht eine RAM Disk einrichten, die Dateien dorthin kopieren und dort bearbeiten, was deutlich schneller ist, als jede Festplatte/SSD. Dies aber benötigt natürlich viel mehr Speicher.

Gucky.
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Eine sehr große Datei lesen

03 Oct 2018, 13:33

@Gucky
was mache ich falsch, habe :
Core i5 Prozessor, 3Gen
8GB Arbeitspeicher
Win10 x64

Doch, wenn ich FileRead, data, xml.xml eine ca. 280 MB große XML Datei lesen will, bekomme ich Meldung #MaxMem
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Eine sehr große Datei lesen

04 Oct 2018, 02:26

Was bedeutet das % Zeichen bei:

Code: Select all

mx :=% zeilennr(data, "0331631")
Variablen werden doch an sich doch so zugewiesen:
1) mx := zeilennr(data, "0331631")

oder

2) mx = % zeilennr(data, "0331631")

oder

3) mx = %Irgendeine_Variable%

Könnte der Fehler vielleicht auch dort liegen?
User avatar
SL5
Posts: 879
Joined: 12 May 2015, 02:10
Contact:

Re: Eine sehr große Datei lesen

04 Oct 2018, 03:11

Gucky_87 wrote:Was bedeutet das % Zeichen bei:

Code: Select all

mx :=% zeilennr(data, "0331631")
ja komisch. vielleicht ist das ein Zeiger auf ne funktion .
also zeilennr nicht selbst ne funktion sondern nur zeiger auf eine andere funktion
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Eine sehr große Datei lesen

04 Oct 2018, 03:51

Moin,

das % Zeichen erzwingt einen Ausdruck, wo nach der Zuweisung := sowieso ein Ausdruck erwartet wird. Es ist deshalb unnütz, aber nicht schädlich. Nach aktuellem Stand wird diese Option in AHK v2 entfernt.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Eine sehr große Datei lesen

04 Oct 2018, 07:23

Ahh, wieder was gelernt. Das war mir nicht bewusst.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 32 guests