![]() |
riesen problem mit großer xml datei
Hallo,
ich hatte damals von meiner firma ein xml dump der datenbank erstellt. Es ist ein xml rdf dokument. Das Problem war, ich hab das damals nciht getestet. Und jetzt versuche ich wie verrückt an die daten ranzukommen doch ich weiß nicht weiter. Das Problem ist, dass die Datei ca 2 GB groß ist und das anzeigen im Browser lässt sich hängen, der Editor sagt dierekt zuwenig Arbeitsspeicher und Wordpad lädt sich auch tot. Das einzigste was ich machen kann ist die datei in nem Hexeditor zu öffnen (HxD hier ausm Forum) Kann mir jemand einen rat geben wie ich an die daten rankomme ? Bis wieviel MB oder GB sollte so eine Datei sein, dass man sie noch öffnen kann ? Hab bei HxD schon versucht mit makieren und rest löschen und teile abzuspeichern. Da man aber nirgens genau etwas makieren kann (von der MB Zahl her) waren die teile so ca 159 MB groß und da macht auch noch alles schlapp Ich bedanke mich schonmal für jeden guten Rat, die Daten sind lebenswichtig! mfg skunker |
Re: riesen problem mit großer xml datei
wenn Du die Datei lesen möchtest, und Dir eine einfache Ansicht als Textdatei und nicht als XML Datei genügt, dann solltest Du das selber programmieren, mit einer einfachen Memo und die Datai quasi "online" lesen. Also nicht vollständig in den Speicher laden, sondern in Abhängigkeit von der Position des Scrollbalkens die entsprechenden Zeilen lesen, die Du zur aktuellen Ansicht benötigst.
Wenn Du XML Features benötigst, dass auch Knoten erstellt werden die Du dann in einem Treeview benutzen möchtest, wirds wahrscheinlich schwer ! Aber nun zum simplen Anzeigen per TextEditor (TMemo) Wenn Du also die Datei "online" liest, kannst Du von den 2 GB jede Zeile ansteuern. Folgender Code von hier: ![]() könnte Dir dabei helfen. Wenn der Scrollbalken sich also in der Mitte befindet, liest Du nur Zeile 10.000 bis 10.020 oder so. Damit das ganze überhaupt schnell funktioniert MUSST Du einen Index über die Datei bilden. (Du kannst Dich ja nicht jedesmal z.b. 1,5 GB von vorn durch die Datei hangeln, das wäre Blödsinn) Also für jeden Anfang einer neuen Zeile musst Du die Byteposition in der Datei in einem Index gespeichert haben. (Datei einmal durchgehen um den Index zu erstellen) Mit diesem Index findest Du also recht flott heraus, an welcher Byteposition Deine x-te Zeile in Deiner Textdatei beginnt. Wenn Du dann noch binäre Such Algorithmen implementierst, sollte das alles so flott gehen, wie als würdest Du eine 50 kb große Textdatei anzeigen. Und wenn Du fleißig suchst, gibts vielleicht so ein Programm schon im Netz ;-) Gruß stoxx
Delphi-Quellcode:
function GrabLine(const AFileName: string; ALine: Integer): string;
var fs: TFileStream; buf: packed array[0..4095] of Char; bufRead: Integer; bufPos: PChar; lineStart: PChar; tmp: string; begin fs := TFileStream.Create(AFileName, fmOpenRead); try Dec(ALine); bufRead := 0; bufPos := nil; { read the first line specially } if ALine = 0 then begin bufRead := fs.Read(buf, SizeOf(buf)); if bufRead = 0 then raise Exception.Create('Line not found'); bufPos := buf; end else while ALine > 0 do begin { read in a buffer } bufRead := fs.Read(buf, SizeOf(buf)); if bufRead = 0 then raise Exception.Create('Line not found'); bufPos := buf; while (bufRead > 0) and (ALine > 0) do begin if bufPos^ = #10 then Dec(ALine); Inc(bufPos); Dec(bufRead); end; end; { Found the beginning of the line at bufPos... scan for end. 2 cases: 1) we'll find it before the end of this buffer 2) it'll go beyond this buffer and into n more buffers } lineStart := bufPos; while (bufRead > 0) and (bufPos^ <> #10) do begin Inc(bufPos); Dec(bufRead); end; { if bufRead is positive, we'll have found the end and we can leave. } SetString(Result, lineStart, bufPos - lineStart); { determine if there are more buffers to process } while bufRead = 0 do begin bufRead := fs.Read(buf, SizeOf(buf)); lineStart := buf; bufPos := buf; while (bufRead > 0) and (bufPos^ <> #10) do begin Inc(bufPos); Dec(bufRead); end; SetString(tmp, lineStart, bufPos - lineStart); Result := Result + tmp; end; finally fs.Free; end; end; |
Re: riesen problem mit großer xml datei
Probiers mal mit
![]() |
Re: riesen problem mit großer xml datei
Wenn du eine so große XML-Datei hast bekommst Du die mit fast 100%iger Sicherheit mit keinem Programm komplett als XML-Dokument in den Speicher.
Was du machen kannst das du deinen verwendeten XML-Parser in einer Art "Streaming-" Modus betreibst ohne intern ein XML-Dokument aufzubauen. D.h. der Parser übernimmt die Arbeit bezüglich XML-Codierungsregeln ab und benachrichtigt dich mittels Events wenn ein Tag eingelesen wurde. Dieses Daten sammelst Du dann solange bis du einen (für dich) gültigen Datensatz hast den du bewerten kannst (z.B. wenn eine kompletter Datenbank-Datensatz gelesen wurde). Damit sollte auch diese große Datei einzulesen sein. |
Re: riesen problem mit großer xml datei
Hallo skunker,
wenn du die Daten damals vom RDBMS hast exportieren lassen, dann gibt es vielleicht auch dort eine Möglichkeit diese Daten wieder in eine DB zurück zu holen (MSSQL: OPENXML). Wenn nicht , dann kannst du den SAX-Parser von Microsoft zur Erstellung eines Importwerkzeuges verwenden. Du musst dazu die MSXML Typelib (V4 oder V6) importieren. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz