Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Große Textdateien verarbeiten (https://www.delphipraxis.net/159661-grosse-textdateien-verarbeiten.html)

-187- 7. Apr 2011 08:54

Große Textdateien verarbeiten
 
Moin,

ich weiss das es schon unzählige Male diskutiert wurde, jedoch wurden in vielen Beiträgen keine Alternativ-Lösungen diskutiert.

Sagen wir ich habe eine Textdatei (500 MB, durchaus möglich) und möchte diese jetzt verarbeiten.
Von Klaus habe ich diese Lösung in einem anderen Thread gefunden, jedoch ist das immernoch zu langsam.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  F:TextFile;
  tmp : String;
begin
  If OpenDialog1.Execute Then
    Begin
    AssignFile(F,OpenDialog1.Filename);
    Reset(F);
    while not eof(F) do
      begin
       Readln(F,tmp);
       // mache etwas mit tmp
      end;
    CloseFile(F);
  end;
end;
Wie würdet ihr an diese Problemstellung rangehen ?

Lemmy 7. Apr 2011 09:00

AW: Große Textdateien verarbeiten
 
Hi,

ich denke "mache was mit tmp" ist hier schon entscheidend... Und was bedeutet "..jedoch ist das immernoch zu langsam.."? Ist hier "mache was mit tmp" das Problem? Oder ist zu wenig Speicher verfügbar um die 500MByte zu laden? IN dem Fall könnten Streams die Lösung sein....

Grüße

p80286 7. Apr 2011 09:12

AW: Große Textdateien verarbeiten
 
Zitat:

Zitat von -187- (Beitrag 1093575)
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  F:TextFile;
  tmp : String;
  buffer : array [0..16383] of byte;
begin
  If OpenDialog1.Execute Then
    Begin
    AssignFile(F,OpenDialog1.Filename);
    settextbuffer(F,buffer);
    Reset(F);
    while not eof(F) do
      begin
       Readln(F,tmp);
       // mache etwas mit tmp
      end;
    CloseFile(F);
  end;
end;
?

Das sollte ein wenig schneller sein.

Gruß
K-H

jfheins 7. Apr 2011 09:22

AW: Große Textdateien verarbeiten
 
Datei aus dem Filestream in einen Memorystream (oder Array oder ...) kopieren und dann dort arbeiten - der Kopiervorgang dauert vielleicht ein wenig (10 Sekunden) aber danach sollte das Arbeiten auf den Daten schnell sein ;)

Falls das jetzt daneben war: Was sind die Anforderungen: Möglichst schnell anfangen zu lesen? Möglichst wenig Speicher verbrauchen?

himitsu 7. Apr 2011 09:59

AW: Große Textdateien verarbeiten
 
Das Laden einer 500 MB AnsiDatei, in eine TStringList, kann schonmal über 1,5 GB RAM benötigen, wobei am Ende 1 GB an Unicode im Speicher verbleibt ...
das könnte schonmal ein bissl eng werden (außer man nutzt Delphi XE2 :stupid:)

http://www.delphipraxis.net/159628-d...ml#post1093342

-187- 7. Apr 2011 10:15

AW: Große Textdateien verarbeiten
 
Hmm aufgrund eurer Posts habe ich nochmal überlegt.. Eigentlich liegt mein Schwerpunkt nicht auf "Schnelligkeit" sondern auf "Wenig Speicher" - Jedoch am besten beides, bzw ein gesundes Mittelmaß finden :)

Es ist durchaus möglich das ich auch mal eine 1 GB Datei habe.

idefix2 7. Apr 2011 10:26

AW: Große Textdateien verarbeiten
 
Und wo liegt das Problem beim ersten von Dir geposteten Ansatz - wenn due die Datei zeilenweise einliest, ist es egal, wie gross sie ist, der Bedarf an Arbeitsspeicher ist vernachlässigbar klein, es braucht ja nur eine Zeile gleichzeitig im Speicher zu sein.

Der Vorschlag von k-h, einen Textpuffer einzuführen, wird den Lesevorgang selbst deutlich beschleunigen, auch ein deutlich grösserer Textpuffer sollte bei einem halbwegs aktuellen Rechner speichermässig verkraftbar sein. Ob das wirklich insgesamt etwas merkliches bringt, hängt davon ab, was Du dann mit den Daten machst, und wie lange die Bearbeitung sonst braucht.

Entscheidend ist überhaupt, was Du mit den Daten machst. readln ist sinnvoll, wenn Du die Daten zeilenweise verarbeitest, andernfalls kann es günstiger und vor allem schneller sein, die Daten blockweise in den Speicher zu holen und vielleicht direkt in einem array of char zu fuhrwerken - aber das kann man eben nur sagen, wenn man weiss, worin genau die Verarbeitung der Daten besteht - readln gehört sicher nicht zu den schnellsten Routinen, dafür bekommst Du die Daten eben schön zeilenweise serviert.

Deep-Sea 7. Apr 2011 10:30

AW: Große Textdateien verarbeiten
 
@-187-:
Wenn du für jede Zeile - und ich denke mal, dass es viele sind - Windows-API-Funktionen bemühst, sinkt die Verarbeitungsgeschwindigkeit rapide. Da ändert auch ein TFileStream nichts.
Ich habe mir mal Klassen zur Verarbeitung von JSON-Dateien geschrieben. Die waren ebenfalls extrem langsam, bis ich mir einen eigenen Puffer angelegt habe. :-D

himitsu 7. Apr 2011 10:33

AW: Große Textdateien verarbeiten
 
Es gibt schon einen Textpuffer, aber der ist "nur" 128 Byte klein und um effektiv zu sein, sollte er am besten ein Mehrfaches der Sektor-Größe, bzw. besser noch der Cluster-Größe des Datenträgers entsprechen und mindestens 4 KB (16, 32 oder 64 KB haben sich da als durchschnittlich gute Werte erwiesen).

-187- 7. Apr 2011 11:02

AW: Große Textdateien verarbeiten
 
Hmm im Grunde möchte ich mit einer Schleife mehrere Dateien in einem Memo aneinander hängen.
Wenn ich die Datei jedesmal direkt dem Memo hinzufüge habe ich Geschwindigkeits Probleme. (Memo=VCL)

Wenn ich die Dateien erstmal in einer StringListe zusammenfüge und am Ende mit "Memo1.Text:=sl.Text" die neue Liste ausgebe dann hab ich ein Speicher Problem.

Wie kann ich also ohne großen Speicherbedarf rießen Liste, zügig zusammenführen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 Uhr.
Seite 1 von 5  1 23     Letzte »    

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