Entwickler-Ecke

Dateizugriff - grosse Datenmenge schnell einlesen


olga - Do 28.08.03 13:42
Titel: grosse Datenmenge schnell einlesen
Hi,

habe ein Eingabe-Problem. Wenn Datensaetze (Koordinatenangaben) sehr gross sind, muessen aber doch als Ganze eingelesen werden, dauert es durch TextFile-Reading zu lange. Ob es geht, irgendwelche streams zum Einlesen zu benutzen? Es ist auch so, dass ich die Trennpunkte (z.B. 234.6) gleichzeitig in , umwandeln muss... Also, hat jemand damit eine Erfahrung gemacht? :roll:

Moderiert von user profile iconAya: Thread verschoben.


MAlsleben - Do 28.08.03 15:09

Hi,

ich habe mal etwas ähnliches aber auch mit textdateien und den "alten" Pascal-Textdatei lesen und schreiben Prozeduren gemacht. Nach assignfile habe ich noch vor dem öffnen einen 8 kb Textbuffer mit settextBuffer erstellt. Wenn ich keinen eigenen Textbuffer setze, ist der Standartbuffer für diese Operation nur 128 byte groß. Das ist für heute Rechner nichts und bremmst nur. Natürlich kann man den Buffer auch noch größer machen. Grenze ist mir soweit nicht bekannt. In meinem Programm werden dann ca. 6 MB große Dateien in 2 Sekunden durchlaufen und in jeder Zeile z.B. Leerzeichen durch Nullen ersetzt.

Gruß Micha.


mimi - Do 28.08.03 20:27

du könntes TFileStream verwänden damit geht das zimlich schnell und mi Twriter und Treader kannst du sehr einfach auf einem stream zugreifen *g*


recall - Mo 01.09.03 13:17

Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure CopyFile(InName, OutName);
var
   inF, outF: TMemoryStream;
   I: Integer;
   C: Byte;
begin
  inF := TMemoryStream.Create;   
  outF := TMemoryStream.Create;   
  try
    inF.LoadFromFile(InName);
    inF.Position := 0;
    For I := 0 to InF.Size - 1 do
    begin
      inF.Read(C, 1);

{hier mach jetzt irgendwas mit den Daten ;) .}

      outF.Write(C,1);
    end;
    outF.SaveToFile(OutName);
    finally
    inF.Free;
    outF.Free;
  end;
end;

muss aber nicht auf Anhieb funktionieren ;) Achso der Quellcode kopiert eine Datei... Lies am besten dazu MemoryStream.Read/Write druch (Delphi Hilfe)...

Siehe aber auch FileStream: Posting von mimi.

Viele Grüsse.

P.S.: Wenn ich Mist geschrieben habe, dann wird der hier versteigert.
Anfangsgebot 1?.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


mimi - Mo 01.09.03 17:07

eine frage warum gehst du über "TMemoryStream" ?
und nicht über "TFileSystem" was schneller sein dürfte.


recall - Mo 01.09.03 19:55

@mim: weil ich es mit Strg+V eingefügt und nicht darauf geachtet habe, wozu ichs eigentlich ursprünglich geschrieben hatte 8) ...
Danach war ich zu blöd dazu es ordentlich zu editieren :roll: .
Also => FileStream !

Viele Grüsse.


recall - Mo 01.09.03 19:57

apropos:

Zitat:
und nicht über "TFileSystem" was schneller sein dürfte

"TFileSystem" ?? :D


mimi - Mo 01.09.03 20:31

Zitat:

apropos:

Zitat:
und nicht über "TFileSystem" was schneller sein dürfte

"TFileSystem" ??

ich meinte TFileStream, immer wenn ich an TFileStream denke schreibe ich satt stream system hin *G*


olga - Di 02.09.03 11:40

Ich bedanke mich bei allen Kollegen!!! Also, probiere ich jetzt mal... 8)


olga - Di 09.09.03 09:28
Titel: dies da...
recall hat folgendes geschrieben:
Hallo,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure CopyFile(InName, OutName);
var
   inF, outF: TMemoryStream;
   I: Integer;
   C: Byte;
begin
  inF := TMemoryStream.Create;   
  outF := TMemoryStream.Create;   
  try
    inF.LoadFromFile(InName);
    inF.Position := 0;
    For I := 0 to InF.Size - 1 do
    begin
      inF.Read(C, 1);

{hier mach jetzt irgendwas mit den Daten ;) .}

      outF.Write(C,1);
    end;
    outF.SaveToFile(OutName);
    finally
    inF.Free;
    outF.Free;
  end;
end;

muss aber nicht auf Anhieb funktionieren ;) Achso der Quellcode kopiert eine Datei... Lies am besten dazu MemoryStream.Read/Write druch (Delphi Hilfe)...

Siehe aber auch FileStream: Posting von mimi.

Viele Grüsse.

P.S.: Wenn ich Mist geschrieben habe, dann wird der hier versteigert.
Anfangsgebot 1?.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.





wenn man die prozedure benutzt, wird ETWAS in den buffer geschrieben. Leider hat das mit meinen daten (float) nichts mehr zu tun... :-(

Gruesse

Olga


mimi - Di 09.09.03 17:09

setzt dich am besten mal mit TFileStream auseinandern dann sollte dein problem gelöst sein. und das auseinander trennen von 100.5 ist auch nicht weiter schwer such am besten mal nach GetTocken hier im forum


barfuesser - Di 09.09.03 17:13

mimi hat folgendes geschrieben:
such am besten mal nach GetTocken hier im forum

also ich würde GetToken vorziehen. :lol:

barfuesser