AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Betriebssysteme riesen problem mit großer xml datei
Thema durchsuchen
Ansicht
Themen-Optionen

riesen problem mit großer xml datei

Ein Thema von skunker · begonnen am 21. Jul 2006 · letzter Beitrag vom 21. Jul 2006
Antwort Antwort
skunker
(Gast)

n/a Beiträge
 
#1

riesen problem mit großer xml datei

  Alt 21. Jul 2006, 04:11
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
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#2

Re: riesen problem mit großer xml datei

  Alt 21. Jul 2006, 05:51
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: http://www.swissdelphicenter.ch/de/showcode.php?id=1628
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;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#3

Re: riesen problem mit großer xml datei

  Alt 21. Jul 2006, 07:45
Probiers mal mit Ultra-Edit (is zwar nur ne Demo-Version, aber 45 Tage sollten dir ja reichen, an die Daten zu kommen ) Damit geht so gut wie alles
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: riesen problem mit großer xml datei

  Alt 21. Jul 2006, 08:21
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: riesen problem mit großer xml datei

  Alt 21. Jul 2006, 08:46
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz