Autor Beitrag
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Di 11.05.04 23:09 
Hallo!

Ich habe momentan ein Problem: und erstelle ich momentan listen mit ca. 32 000 Zeilen. Teilweise noch mehr! Das Problem ist, dass ich ca. 12 Minuten brauche um eine solche Datei zu erstellen ;) Allerdings ist meine Rechner davon lange noch nicht ausgelastet.

Die Datei wird übrigens von einer While-Schleife erstellt. Gibt es eine möglichkeit vielleicht 10 Whileschleifen gleichzeitig laufen zu lassen oder so?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 11.05.04 23:19 
Höchstens mit Threads, aber da sich die Threads dann wieder alle die eine Datei teilen müssen läuft es auf dasselbe hinaus..

Wie erstellst du die Datei denn, also woher kommen die Daten? Arbeitest du mit FileStreams oder WriteLn?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mi 12.05.04 01:33 
Hallo!

Karlson hat folgendes geschrieben:
Allerdings ist meine Rechner davon lange noch nicht ausgelastet.


Dann beschaffe bitte eine SCSI-Festplatte mit 10.000 Umdrehungen! Alternativ könnte auch eine IDE-Platte mit mindestens 1GB Cache eingesetzt werden (gibts das überhaupt? - Preis?). :mrgreen:

Offensichtlich ist das Problem nicht die Schleife, sondern die Tatsache, daß die Festplatte nicht so schnell speichern kann, wie die Daten geliefert werden.
Möglich wäre natürlich noch, daß der Rechner falsch konfiguriert ist (DMA nicht aktiv).

Wenn Du dagegen die Datei in mehrere Portionen aufteilen könntest und diese Häppchen dann in Threads erzeugst, wird das Ganze noch langsamer - die Platte muß ja den Magnetkopf für jede Datei einzeln bewegen. Bei einer Datei kann fortlaufend geschrieben werden.

Wie sieht es übrigens mit RAM aus - wenn Windows die Auslagerungsdatei benutzen muß, bremst das das Gesamtsystem doch sehr aus.

Gruß

Dietmar Brüggendiek
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 12.05.04 12:11 
Hi,

bei 12 Minuten schreibzeit denke ich, dass es auf einen Schlechten "schreibrithmus" zurückführen lässt. Wie Motzi ja auch andeutete. Wenn du in jeden wieder erneut mit WirteLn in die Datei schreibst, dann muss jedesmal der Schreibkopf neu positioniert werden usw. dadurch wird das langsam. Wenn du Die Daten alle im Speicher sammelst und mit einem Mal wegschreibst, dann sollte es schneller gehen.

Wenn es sich um Text handelt, dann versuche mal in der Schleife die Daten in einer Stringlist zu sammeln und diese am Ende mit WriteToFile zu speichern.

Sollten dabei zu viele Daten anfallen, schreibe alle 1000 Datensätze in die Datei dann hast du nämlich nur 32 Dateizugriffe im gegensatz zu 32000. Nur kannst du das dann nicht mmehr ganz so einfach machen ;).

Gruß
Klabautermann
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: Mi 12.05.04 13:06 
Genau - alles in Blöcken zusammenfassen und dann schreiben! Nicht jede Zeile einzeln. Nicht umsonst haben die heutigen Festplatten einen Mords Cache...

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mi 12.05.04 13:42 
Ja das wird wohl dann der schreibrythmus sein, ich poste mal einen Teil davon:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
while x <> xe+1 do
  begin
    x := x+1;

    memo1.lines.add(inttostr(x) + ' ' + inttostr(y));  //wenn ich anstatt memo1.lines eine TStringvariable nehme?
    if x = xe then
      begin
         if y <> ye then
           begin
             x := 0;
             y := y + 1;
             image2.Canvas.Pixels[5,y] := clblack;
           end
             else
               begin
                 x := xe+1;
                 showmessage('gay');
               end;


ich bin momentan nicht daheim, und hab das mal so aus dem Kopf geschrieben, abgesehen von ein paar Schreibfehler die mir hier unterlaufen sein werde, deckt sich das aber mit dem was ich zuhause benutze!


edit: Wegen Rechenauslastung nochmal: Es steht zwar im Taskmanager 100% Cpu auslastung, allerdings läuft alles absolut flüssig (nur die project1.exe hat probleme...)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.05.04 14:29 
Das Problem ist, dass du Memo1 benutzt. Das Memo wird bei jeder neuen Zeile aktualisiert.

Optionen:

- TStringlist-Instanz erstellen und verwenden.
- Memo.Lines.BeginUpdate/EndUpdate verwenden, um Zwischenaktualisierungen zu vermeiden.

Cu,
Udontknow
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mi 12.05.04 14:40 
Danke werde ich gleich ausprobieren, habe noch eine wichtige Frage die ich auch schon im Ot habe. Aber hier kann man sich wahrscheinlich mehr darunter vorstellen: Wie gross wird die Datei werden wenn ich sie als txt abspeichere und dann packe??
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.05.04 14:58 
Keine Ahnung. Das hängt u.a. davon ab, ob es viele "Wiederholungen" in den Daten gibt. Wenn 80% der Werte nur "0" sind, dann wird er das sehr stark packen können.

Allein schon, weil du nur wenige unterschiedliche Zeichen in die Textdatei schreibst (1-0,Freizeichen,Carriage-Return), wird die komprimierte Datei nur einen Bruchteil (<5%) groß sein.

Cu,
Udontknow
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mi 12.05.04 16:12 
Ja es sind nur 5% aber das ist auch noch zu viel :cry:
Ich hab eigentlich versucht irgendwas zu schreiben damit ich meine Bilder für ein Referat auf eine Diskette bringe. Dann dacht es müsste doch möglich sein die Farbe jeden Pixels auszulesen und zu speichern...das das eine so riesengroße Datei wird dachte ich nicht. Naja das "gepackte" Bild hat dann im Endeffekt wenn mans auch nicht mit winrar "rart" 200kb, während das orginal ~70kb hat :) Was ein erfolg...
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mi 12.05.04 16:50 
was erwartest du? speicher halt einfach die farbinfo in einem 32-bit-integer-wert und speicher den ab - OHNE positions info. die kannste im "header" speichern (höhe, breite - breite reicht eigentlich).
im vergleich zu vorher sparst du jede menge platz:

vorher:
1_0 $FFFFFF > 13 bytes (inklusive windows-neue-zeile) pro bildpunkt

nachher:
header (minimal 4 bytes: breitenangabe)
farbwert für einen pixel > 4 bytes

oder eine ganz einfache methode:
lass das original, oder soll das ein referat über bildkompression werden?


raziel

_________________
JSXGraph
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: Mi 12.05.04 21:49 
Danke erstmal für den Tip mit der Stringlist. Klappt vorzüglich. So schnell kommt man von 12 Minuten auf 5 Sekunden :lol:

Danke Raziel, für den Tip mit dem Platz sparen! So kann ich immerhin gut 50-60% nochmal an Grösse sparen. thx.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 12.05.04 22:33 
Nicht umsonst ist JPEG das so ziemlich am weitesten verbreitete Format.. JPEG komprimiert Bilder mit Hilfe der so genannten Diskreten Cosinus Transformation (DCT), da steckt schon jede Menge Mathematik dahinter..! Wenn es so einfach wäre ein Grafik-Format mit besserer Komprimierung zu entwickeln hätte das bestimmt schon jemand gemacht..! ;)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Karlson Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: So 16.05.04 13:44 
Jo da haste recht. Naja hat nicht geklappt, wenigstens hab ich wieder was dazu gelernt ;)