AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

optimierung

Ein Thema von grinsebacke · begonnen am 7. Mär 2013 · letzter Beitrag vom 9. Apr 2013
Antwort Antwort
Seite 1 von 2  1 2      
grinsebacke

Registriert seit: 9. Sep 2008
3 Beiträge
 
Delphi XE2 Enterprise
 
#1

optimierung

  Alt 7. Mär 2013, 09:14
Hallo Gemeinde,
und zwar hoffe ich auf ein paar tipps von euch.
ich lese eine große datenmenge über einen stringstream ein ca 10mb.
wenn ich nun dieses stream durchsuche beispielsweise nach einem höchsten messwert dauert das eweig.
ich benutze eine simple for schleife.
Nun meine frage welche möglichkeiten gibt es berechnungen zu beschleunigen.
Ich hoffe auf ein paar tipps oder begriffe.
Vielen dank
grinsebacke
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: optimierung

  Alt 7. Mär 2013, 09:27
Den größten Wert in einer verketteten Liste zu suchen ist an sich keine komplexe "Berechnung".

Wächst die Liste auf das zehnfache an, wird es (im Groben) auch zehn mal so lange dauern - Diese Operation (das Suchen des größten Werts) hat eine lineare Laufzeit.

Würdest du aus dieser Liste nicht den größten Wert haben wollen sondern den in der Mitte, ist das immer gleich schnell - Egal wie groß deine Liste ist.

Weiteres zur Laufzeit mit anschaulichen Beispielen findest du z.B. bei

Zu deinem konkreten Problem:
Wenn deine Eingabedaten wirklich absolut unsortiert vorliegen und du nur einmal den größten Wert suchen willst, kann man da nicht viel machen (oder ich stehe ebenfalls auf dem Schlauch). Die meiste Zeit wird höchstwahrscheinlich für das Parsen der Fließkommazahl aus dem String sein - So etwas ist nicht mit ein paar CPU-Takten erledigt!

Hast du nicht die Möglichkeit, die Daten wenigstens direkt als Zahlen einzulesen und nicht als Strings?

Gibt es genaueres? Vielleicht liest du ständig neue Blöcke von der Platte anstatt den ganzen Kram wenigstens einmal komplett in den Hauptspeicher zu schaufeln?

Geändert von Der schöne Günther ( 7. Mär 2013 um 09:30 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: optimierung

  Alt 7. Mär 2013, 09:59
. Du könntest den Stream in mehrere Abschnitte einteilen.
Pro Abschnitt dann einen Thread einsetzen der den höchsten Wert aus dem Abschnitt holt.
Zum Schluss alle "höchsten" Werte der Threads vergleichen und daraus den höchsten der Gesamtdatenmemge ermitteln.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: optimierung

  Alt 7. Mär 2013, 10:33
Zusätzlich würde ich noch anregen, das hier 2x durch die 10mb gerattert wird. Das erst Mal beim einlesen und das zweite Mal beim parsen/ermitteln des höchsten Wertes. Beim Einlesen könnte man einen DEA (Deterministischer Endlicher Automat) verwenden, der eine Fließkommazahl fast ohne Zeitverluste erkennt. RegEx arbeitet so, wäre also auch eine Variante.

Wenn die Thread-Variante möglich ist, könnte dies jedoch wirklich die einzige Optimierungsmöglichkeit sein.
Würdest du aus dieser Liste nicht den größten Wert haben wollen sondern den in der Mitte, ist das immer gleich schnell - Egal wie groß deine Liste ist.
'den in der Mitte' = Median? Bei einer verketteten Liste musst Du trotzdem (n/2) Operationen durchführen, um den Median zu erreichen, ergo O(n). Bei einem Array natürlich nicht.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: optimierung

  Alt 7. Mär 2013, 10:42
Hoppla, als die Finger die Tasten berührten war die verkettete Liste bereits wieder auf meinem Hinterkopf verschwunden.

Ohne Hilfszeiger ist das Navigieren zum Wert in der Mitte tatsächlich weiterhin linear.
  Mit Zitat antworten Zitat
grinsebacke

Registriert seit: 9. Sep 2008
3 Beiträge
 
Delphi XE2 Enterprise
 
#6

AW: optimierung

  Alt 7. Mär 2013, 10:54
wow das ist ja hier ein super forum,
hätte garnicht mit soviel antworten gerechnet.
Das einlesen der Daten und konvertieren (hex->int) dauert ca 6 sekunden.
Das Suchen nach dem größten und kleinsten wert ca. 12 sekunden.
Ich werde mal versuchen einen Thread anzulegen mal sehen.
Erstmal vielen Dank für eure Mühe.
grinsebacke
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

AW: optimierung

  Alt 7. Mär 2013, 11:04
Das einlesen der Daten und konvertieren (hex->int) dauert ca 6 sekunden.
Das Suchen nach dem größten und kleinsten wert ca. 12 sekunden.
Die Bestimmung dee größten und kleinsten Wertes sollte doch praktisch in nicht ins Gewicht fallen im Vergleich zur Umwandlung? Nach dem Schema
Code:
min := MaxInt;
max := -MaxInt;
for ...
  hex -> int
  if int < min then min := int;
  if int > max then max := int;
endfor
Oder habe ich etwas falsch verstanden?
  Mit Zitat antworten Zitat
grinsebacke

Registriert seit: 9. Sep 2008
3 Beiträge
 
Delphi XE2 Enterprise
 
#8

AW: optimierung

  Alt 7. Mär 2013, 11:16
Jo danke genau das habe ich gerade getan.
Aber im ganzen wird es leider nicht schneller.
Vielleicht finde ich im code ja doch noch ein paar optimierungen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: optimierung

  Alt 7. Mär 2013, 12:38
Wenn Du Dein Projekt etwas genauer beschreibst (Quelltext?), kann man vielleicht noch genauer helfen.

Wie oft musst Du denn suchen? Wie oft ändern sich Werte? Gibt es zu den Strings andere zugehörige Daten?
Evtl. ist es sinnvoll, die Daten sortiert zu verwalten.

Welche Delphi-Version nutzt Du denn?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: optimierung

  Alt 7. Mär 2013, 14:01
hmm

10mb mit einem Blockread in den Speicher laden!

Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:34 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