|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 10.01.2004, 15:32 Titel: sehr große Datei durchsuchen |
|
|
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 |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 10.01.2004, 15:40 Titel: |
|
|
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...
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 10.01.2004, 15:40 Titel: |
|
|
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 |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 10.01.2004, 15:55 Titel: |
|
|
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. |
|
Nach oben |
|
|
Mazze JLI'ler
Alter: 39 Anmeldedatum: 02.01.2004 Beiträge: 145
Medaillen: Keine
|
Verfasst am: 10.01.2004, 16:16 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 10.01.2004, 17:12 Titel: |
|
|
Beim MemoryMapping wird die Datei nicht in den Speicher geladen, sondern die Speicheradressen zeigen auf die Datei -- das ist ein klitzekleiner Unterschied _________________
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 |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 10.01.2004, 17:41 Titel: ... |
|
|
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! <--- 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 |
|
|
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 10.01.2004, 18:43 Titel: |
|
|
@mr. x
das mit den 277MB macht das betriebssystem. normalerweise puffert windows dann die datei so das sie reinpast.... |
|
Nach oben |
|
|
Mr.X Junior JLI'ler
Anmeldedatum: 15.04.2003 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 10.01.2004, 19:10 Titel: |
|
|
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 |
|
|
Mazze JLI'ler
Alter: 39 Anmeldedatum: 02.01.2004 Beiträge: 145
Medaillen: Keine
|
Verfasst am: 10.01.2004, 19:19 Titel: |
|
|
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 |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 10.01.2004, 21:53 Titel: |
|
|
Es kommt jetzt nur noch darauf an, was du machen willst, wenn du den String gefunden hast, den du suchst
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 _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 10.01.2004, 23:39 Titel: |
|
|
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 |
|
|
|
|
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
|