JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=b402e5e0d83d522d43fd62de6144d081Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

sehr große Datei durchsuchen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 15:32    Titel: sehr große Datei durchsuchen Antworten mit Zitat

Hi,
ich will eine sehr große Textdatei durchsuchen(277MB). Weiß jemand wie man sowas anstellen könnte? Also zB nach einer Ziffernfolge suchen(handelt sich hier um die Zahl PI).

Ich würde ja auch gerne die Datei aufsplitten, aber sie ist zu groß um sie überhaupt irgendwo zu laden(Editor etc.).

danke.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 15:40    Titel: Antworten mit Zitat

Doch ganz normal wie man jede Datei nach einer Ziffernfolge durchsuchen würde?

Und WordPad und MS Word können solche großen Dateien locker öffnen, dauert dann nur etwas...Wink

Editor wurde nur für Dateien bis ca. 10MB ausgelegt...


Also da verändert sich nichts wenn man mit großen Dateien arbeitet anstatt mit Kleineren...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 15:40    Titel: Antworten mit Zitat

Google mal nach "pattern matching", von Boyer-Moore gibt es da einen guten Algorithmus, aber ich meine, es gibt noch effektivere.

viele grüße
Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 15:55    Titel: Antworten mit Zitat

Das man es mit Programmen wie WordPad oder auch InternetExplorer öffnen kann, habe ich auch gerade rausgefunden.

Nur, wie kann ich so eine Datei in meinen Programm durchsuchen? Versucht das Programm dann alles in den Arbeitsspeicher zu schieben oder nur die aktuelle Zeile(mit feof(); )??
Ich will schließlich das man das ganze auch recht schnell ausführen kann, auch auf lahmen PC's. Confused
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 16:16    Titel: Antworten mit Zitat

Hi
Eine Datei dieser größe würde ich am besten erstmal komplett in den Speicher laden,
das ganze mit der gepufferten IO erstmal von der Platte zu lesen würde da denk ich mal länger dauern...
Stichwort dazu wäre z.b. Memory Mapping (die Windows Funktionen die dafür zuständig sind fangen glaub mit VirtualMemory oder so an)

Anschließend kannste das ganze dann Durchsuchen...je nachdem welche Techniken es da gibt...

Edit:
Die Funktionen heißen z.b.:
VirtualAlloc,VirtualFree....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 17:12    Titel: Antworten mit Zitat

Beim MemoryMapping wird die Datei nicht in den Speicher geladen, sondern die Speicheradressen zeigen auf die Datei -- das ist ein klitzekleiner Unterschied Wink
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 17:41    Titel: ... Antworten mit Zitat

Mazze hat Folgendes geschrieben:
...
Eine Datei dieser größe würde ich am besten erstmal komplett in den Speicher laden, ....

Und was ist mit den Leuten mit max. 256 MB Ram? Wie sollen die eine solche 277MB-Datei in den Speicher bekommen?
edit-->Nachtrag: in den per Hardware zur Verfügung stehenden RAM, nicht den von Windows virtuell zur Verfügung gestellten! Wink <--- edit

@Mazze
Virtual Memory nutzt Festplatten-Speicher, wenn der RAM nicht ausreicht, und dadurch hättest Du ganz sicherlich keinen Geschwindigkeitsvorteil.


@MiracleBoy - Für eine eigene Implementierung des Ganzen:
Reserviere eine sinnvolle Speichergröße (zb.16K,64K,...), ließ dann den ersten Bereich (je nach Deiner reservierten Größe) von der Datei in diesen Bereich ein und durchsuche diesen wie gewünscht. Danach kommt der nächste Bereich der Datei dran (den Filepointer hast Du ja sinnvollerweise gespeichert). Ebenfalls in Deinen reservierten RAM einlesen und durchsuchen. (Dabei werden zwar die alten Daten überschrieben im RAM, aber diese hattest Du ja bereits durchsucht).
Das ganze führst Du halt bis zum eof durch.

Als Sonderfall wäre hierbei nur zu beachten, wenn der Suchtext gerade über so einer Bereichsgrenze liegt. Dazu müsstest Du maximalen Extraspeicher in Größe des Suchtextes - 1 Byte (der Fall, das der erste Buchstabe im ersten Bereich und der Rest des Textes im zweiten Bereich steht) reservieren. In solch einem Fall musst Du halt eine Sonderbehandlung durchführen, das Du eben in diesen Extraspeicher bereits die Daten aus dem nachfolgenden Bereich entsprechend der Größe kopierst und dann diesen mitprüfst.


Zuletzt bearbeitet von Mr.X am 10.01.2004, 19:32, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nigs
Super JLI'ler



Anmeldedatum: 19.12.2002
Beiträge: 359

Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 18:43    Titel: Antworten mit Zitat

@mr. x
das mit den 277MB macht das betriebssystem. normalerweise puffert windows dann die datei so das sie reinpast....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 19:10    Titel: Antworten mit Zitat

nigs hat Folgendes geschrieben:
@mr. x
das mit den 277MB macht das betriebssystem. normalerweise puffert windows dann die datei so das sie reinpast....


Bitte erst meinen Post vollständig lesen und verstehen!
Das man trotzdem größere Dateien laden kann als man RAM zur Verfügung hat ist mir klar! Hierbei ging es aber um die Effektivität/Geschwindigkeit!

Und:
Windows puffert die Datei nicht, das diese in den RAM passt, sondern erweitert virtuell den hardwaremäßig zur Verfügung stehenden RAM, indem es eben Festplattenspeicher dafür nutzt! Dich als Programmierer brauch das nicht zu interessieren, da eben der Memory-Manager von Windows Dir die Arbeit abnimmt.
Aber was hättest Du dadurch für einen Vorteil erlangt, wenn intern trotzdem wieder eine Menge I/O-Routinen zur Festplatte genutzt werden müssen???
Eben aus diesem Grunde kannst Du mit oben beschriebener Methode diesen Flaschenhals minimieren!


Zuletzt bearbeitet von Mr.X am 10.01.2004, 19:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 19:19    Titel: Antworten mit Zitat

Is mir schon klar das dann geswappt wird.......aber ich fänd es auf diese weise Effizienter(jedenfalls wenn dann noch geschrieben oder "geseekt" werden würde..)
ok..wenns nur um's durchsuchen geht machts nicht soo viel sinn...ack...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 21:53    Titel: Antworten mit Zitat

Es kommt jetzt nur noch darauf an, was du machen willst, wenn du den String gefunden hast, den du suchst Wink

Denn es wird wohl nicht dein Hauptziel sein zu prüfen, ob in einer so großen Datei eine gewisse Zeichenkette vorkommt oder nicht. Je nachdem richtet sich natürlich die Art wie du mit der Datei arbeiten wirst...

Konnte dir bis jetzt geholfen werden oder brauchst du noch mehr Tips? Dann würde ich dir aber empfehlen uns mitzuteilen was du danach noch alles mit der Datei anstellen willst Wink
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 10.01.2004, 23:39    Titel: Antworten mit Zitat

Wenn es um mehr, als nur um einfaches lineares durchsuchen der Datei geht, (dafür müsste man nicht versuchen, die Datei komplett in den Speicher zu laden) ist die Technik der "Memory Mapped File" in gewissen Grenzen sinnvoll. Damit sich der Aufwand für MMF's lohnt, sollte die Datei mindestens 100 MB groß sein. Desweiteren stehen von dem 4GB-Adressraum einer Anwendung nur 2GBfür die Anwendung selbst zur Verfügung (0-2GB), der 3. GB ist für Dll-Dateien und der letzte für System und Kernel reserviert. (Damit eine Dll- oder Kernelfunktion in deiner Anwendung aufgerufen werden kann (und das muss sie 100%-ig), muss sich die Funktion im Adressraum der Anwendung befinden, also bei normalen Dll's zwischen 2 und 3GB und bei SystemDll's zwischen 3 und 4GB...
Da deine Anwendung selbst noch ein klein wenig Speicher verbraucht, bleibet für MMF's in aller Regel maximal 1,5GB freier Platz übrig. Dass bedeutet, die Datei sollte nicht größer als 1,5 GB sein - es sei denn du programmierst auf einem 64-Bit-Windows...
Zum System von MMF's: Wenn du eine Datei als MMF in des Speicherbereich lädst, passiert erst mal nicht viel mehr, als dass du einen Speicherpointer bekommst. Liesst du jetzt relativ von diesem Pointer einen Wert ein, wird dieser Wert aus der Datei geholt, speicherst du etwas, wird das in die Datei geschrieben. Du hantierst also nur mit ganz normalen Pointern herum, z.B. ein
Code:
memset(Startpointer, 0, Länge_der_Datei);
würde einfach die komplette Datei mit 0-Bytes überschreiben, ohne dass du einen direkten Schreibbefehl an irgendeine Datei gegeben hast... Die Dateizugriffe sind natürlich gepuffert, man kann fast mit Ram-Geschwindigkeit von Platte lesen und schreiben.
MMF's sind Ideal für binäre Datenbestände zwischen 100MB und 1,5GB
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum