AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Große Textdateien verarbeiten

Ein Thema von -187- · begonnen am 7. Apr 2011 · letzter Beitrag vom 7. Apr 2011
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#1

Große Textdateien verarbeiten

  Alt 7. Apr 2011, 09:54
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 ?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.364 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 10:00
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 10:12
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 10:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 10:59
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 )

http://www.delphipraxis.net/159628-d...ml#post1093342
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Apr 2011 um 11:01 Uhr)
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#6

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 11:15
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.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 11:26
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.

Geändert von idefix2 ( 7. Apr 2011 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 11:30
@-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.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 11:33
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#10

AW: Große Textdateien verarbeiten

  Alt 7. Apr 2011, 12:02
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:19 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