RE und Python 2.5.2: Probleme beim Matching von > 2GB

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Hallo zusammen,

ich match emit einem RE einen Bereich in einem File der größer als 2GB ist. Dann bekomme ich mit m.end für den Endindex einen negativen Wert, d.h irgend etwas läuft da über.... Da ich diesen Index brauche bin ich jetzt am überlegen, wie ich den anders bekommen könnte? Ideen sind willkommen.

Grüße
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Dazu solltest du uns vielleicht verraten, was das für Daten sind und wie dein re bisher aus sieht? RE ist nützlich, man kann aber nicht alles damit machen.
Bottle: Micro Web Framework + Development Blog
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Ich wollte eingentlich nicht alles umstellen. Gibt es denn eine andere Möglichkeit diesen Index zu bestimmen? Ist das möglicherweise in Python 2.6 oder später gefixt?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Defnull hat geschrieben:Dazu solltest du uns vielleicht verraten, was das für Daten sind und wie dein re bisher aus sieht?
Sorry, BastiL, aber Kristallkugeln sind nicht in der Python Standardlib.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

CM hat geschrieben:Sorry, BastiL, aber Kristallkugeln sind nicht in der Python Standardlib.
Die Batterien dafuer sind aber dabei! :twisted:
Vllt sollte man ein Aequivalent zu `antigravity` vorschlagen? 8)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich dachte immer Kristallkugel wäre `chr()`. :o
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Also: mein Re sieht so aus:

Code: Alles auswählen

ausdruck=re.compile(r'\(0 "Grid:"\).*(?s)(?=\(0 "Thread variables:"\))').search(File, re.I)
Die Daten sind vertraulich, aber das Schema ist dieses:

Einige MB
(0 "Grid:"
einige GB Daten
(0 "Thread variables:"
einige MB

Sofern der Bereich "einige GB" kleiner als 2GB ist läuft alles wie es soll. Ich versuche unter anderem, den Bereich ab (0 "Thread variables" bis zum Dateiende anzusprechen und verwende dazu

Code: Alles auswählen

ausdruck.end(0)
Dieser Ausdruck wird negativ, sobald einge GB > 2GB wird.... Ich denke das ist ein Python-internes Problem. Was ich schon versucht habe:

- Statt auf den Mittelteil der Datei auf das Ende zu matchen - dann wird das Suchen SEHRSEHR viel langsamer. Das will ich nicht.
BlackJack

Wenn `n` die negative Zahl ist, kommt dann bei ``(-n ^ 0xffffffff) + 1`` der richtige Offset heraus? Dann wäre das zumindest schon einmal eine Notlösung.

Edit: Darf ich mal nach dem Sinn von `re` bei diesem simplen Ausdruck fragen? Da kann man doch auch mit `index()` bzw. `find()` arbeiten!?
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:Wenn `n` die negative Zahl ist, kommt dann bei ``(-n ^ 0xffffffff) + 1`` der richtige Offset heraus? Dann wäre das zumindest schon einmal eine Notlösung.
Werde ich testen.
Edit: Darf ich mal nach dem Sinn von `re` bei diesem simplen Ausdruck fragen? Da kann man doch auch mit `index()` bzw. `find()` arbeiten!?
Ja - es geht bei der speziellen Struktur der Files so deutlich schneller. Der Teil "einige GB Daten" enthält Binärdaten die die Suche offensichtlich ganz erheblich ausbremsen. Wir reden hier von ein paar ms im Vergleichzu mehreren Minuten Dauer zum durchsuchen....
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

BlackJack hat geschrieben:Edit: Darf ich mal nach dem Sinn von `re` bei diesem simplen Ausdruck fragen? Da kann man doch auch mit `index()` bzw. `find()` arbeiten!?
Some people, when confronted with a problem,
think "I know, I'll use regular expressions."
Now they have two problems. -- Jamie Zawinski

[edit]
Ich gehör auch zu diesen Leuten. :oops:
[/edit]
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@BastiL: Also bei *dem* regulären Ausdruck kann eine Lösung mit `find()` nicht wirklich langsamer sein.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:@BastiL: Also bei *dem* regulären Ausdruck kann eine Lösung mit `find()` nicht wirklich langsamer sein.
Das dachte ich auch. Ich werde am Montag nochmal ein Benchmark fahren. Der reguläre Ausdruck ist für eine Datei dieser Größe einfach sensationell schnell..... Ich weiss auch nicht warum.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Es wundert mich überhaupt, dass Strings mit mehr als 2 GB Daten funktionieren. Ist das eine 64-Bit-Version von Python? Falls nein, würde ich empfehlen, eine solche zu benutzen, denn ich denke nicht, dass eine 32-Bit-Version mit 4-Byte-Integern über die 2**31-1-Grenze für Strings und ihre Indices kommen kann. Falls du kein 64-Bit-Betriebssystem hast, bleibt dir nur, das ganze in mehreren Teilen zu untersuchen.

Stefan
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

sma hat geschrieben:Es wundert mich überhaupt, dass Strings mit mehr als 2 GB Daten funktionieren. Ist das eine 64-Bit-Version von Python
Ja ist es 64 Bit Linux.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

BlackJack hat geschrieben:Wenn `n` die negative Zahl ist, kommt dann bei ``(-n ^ 0xffffffff) + 1`` der richtige Offset heraus? Dann wäre das zumindest schon einmal eine Notlösung.
Das funktioniert so. Notlösung gefunden
Darf ich mal nach dem Sinn von `re` bei diesem simplen Ausdruck fragen? Da kann man doch auch mit `index()` bzw. `find()` arbeiten!?
Dabei ist das Problem, dass die Datei per mmap in den Hauptspeicher gelesen wird und damit offensichtlich kein String ist. Deshalb konnte ich gerade kein Benchmark zur Performencekontrolle fahren, um find() mit dem regEx zu vergleichen. Geht das irgendwie, ein mit mmap eingelesenes File mit find() zu bearbeiten?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Vielleicht mit dem deprecated find aus dem String-Modul?

Code: Alles auswählen

string.find(mmap, substring)
MfG
HWK
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Ich habe inzwischen festgestllt, das find() doch geht. rfind sollte laut mmap-Doku auch gehen tut bei mir aber nicht. Rindex und index gehen nicht, wie auch in der Doku beschrieben.
Die Suchzeit verändert sich für ein 3,7 GB-File von wenigen ms (mit regex) auf 12,4s mit find. Daher ist find für mich schlicht zu langsam und ich verwende die vorgeschlagene Notlösung.
Antworten