AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein while not Eof(myFile), wie CPU Load in den Griff bekommen?

while not Eof(myFile), wie CPU Load in den Griff bekommen?

Ein Thema von schwa226 · begonnen am 21. Sep 2011 · letzter Beitrag vom 27. Sep 2011
Antwort Antwort
Seite 1 von 3  1 23   
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 21. Sep 2011, 22:32
Hallo!

Ich habe einfach keine Idee wie ich es schaffe die CPU Load in den Griff zu bekommen!

Ich öffne ein TXT File und lese eine Zeile nach der anderen ein.
Wenn die ersten 4 Chars dem gesuchten entsprechen habe ich die richtige Zeile gefunden und die Schleife wird abgebrochen.

Delphi-Quellcode:
while not Eof(myFile) do
begin
ReadLn(myFile, tmp_line);
...
..
end;
In dieser Schleife geht die CPU Last natürlich hoch. Ein Sleep(1) würde die CPU Last lösen, aber die Dauer natürlich extrem verlängern wenn es ca. 10000 Zeilen sind.

Wie macht man das am besten um trotzdem schnell zu sein aber die CPU Last unten zu halten?

Danke!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 21. Sep 2011, 22:39
1. Lade die Datei in eine StringList und Suche in selbiger
2. lagere den Suchcode in einem Thread aus

Die CPU Last ist eigentlich nicht schlimm (wenn der Rechner arbeitet ist es ja gut)
Schlecht ist nur, wenn die Form lange blockiert wird, dann sieht es so aus, als ob das Programm abgestürzt ist
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#3

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 21. Sep 2011, 22:41
Naja, das durchgehen der Zeilen benötigt einfach die CPU-Rechenzeit. Und um das möglichst schnell hinzubekommen, steigt somit die CPU-Last auf 100% (bzw die Last von einem Kern). Wenn du nicht willst dass deine Anwendung solange einfriert, könntest du das ganze in einen Thread auslagern, oder mittels Application.ProcessMessages weiterhin die Oberfläche aktiv halten. Oder möchtest du das dem Rest deiner Anwendung die CPU-Last zur Verfügung steht, und deswegen die Schleife ausbremsen? Auch dann wäre ein Thread die richtige Lösung.

Edit: Goddemit, nicht schnell genug.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 21. Sep 2011, 23:05
Was ist dir lieber? Dass die CPU das tut für was du sie gekauft hast und arbeitet oder, dass sie zwischen durch Däumchen dreht? Was ist daran so schlimm, wenn die CPU ausgelastet ist? Kritisch wird es erst, wenn sie anderen Prozessen keine Ressourcen mehr zur Verfügung stellt. Aber das passiert nur wenn man dem Thread die höchste Prioritätsstufe gibt, was du wahrscheinlich nicht gemacht hast.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#5

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 04:40
10000 Zeilen sind kein Problem, das merkt man doch gar nicht... Wenn man, wie schon erwähnt, z.B. mit einer TStringlist arbeitet.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 05:07
Oder du nimmst diese Unit von mir dafür. Diese bietet ein Readln an, so dass du nicht viel umstellen musst, ist durch die Verwendung einer MMF aber deutlich schneller.
http://www.delphipraxis.net/151898-s...ei-reader.html
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 06:57
Danke für eure Tipps!

Meine Programm ist eine Multithread Anwendung.
Und wenn nun ein Thread für eine Kurze Zeit die CPU voll auslastet haben die anderen ja nichts mehr davon. Und wenn nun mehrere Threads gleichzeitig das File lesen wollen geht die CPU Last erst richtig hoch.

Ich werde es einmal mit der TSJMmfFileReader probieren.
Das Problem was ich noch habe, ist das ich gleichzeitig auch eine SQLite Database genau so durchsuchen will.

Meine Idee ansonsten ist die Dateien global einzulesen. Bei einer Suche wird zuerst überprüft ob sich die Datei verändert hat (Durch externen Editor). Wenn nicht dann die Globale (z.B. StringList) verwenden oder ansonsten halt die Datei neu laden. Um die Daten aber neu zu laden bräuchte man wieder eine ThreadSafe StringList was wieder den gleichzeitigen Zugriff blockiert.

Wie gesagt, die Daten werden nur gelesen und nicht verändert. Somit sollte eine globale StringList ausreichen.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 08:16
Also mal zusammengefasst:

Du hast da eine Text-Datei mit mehreren Zeilen.
Die Zeilen unterscheiden sich auf jeden Fall in den ersten 4 Zeichen.
Nach diesen 4 Zeichen möchtest du suchen um dann den Rest der Zeile zu finden.

Dann würde es sich doch anbieten diese Datei zu lesen und einen sortierten Index über die ersten 4 Zeichen zu generieren.
in diesem Index wird dann gesucht (das geht z.B. in einer sortierten StringList rasend schnell)

Alle Threads greifen auf diesen Index zu ... oder kopieren sich den Index in eine neue Instanz und suchen dann.

Wenn aber viele Threads die gleiche Datei immer wieder durchsuchen, dann ist der Rechner die meiste Zeit damit beschäftigt die Daten von der Platte zu lesen und das treibt die CPU Last unnötig nach oben.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 09:13
Und wenn nun ein Thread für eine Kurze Zeit die CPU voll auslastet haben die anderen ja nichts mehr davon.
Wenn du die Threads nicht auf mehrere Kerne verteilst, kann auch die CPU nur eins nach dem anderen machen und da spielt die Auslastung keine Rolle.

Zitat:
Und wenn nun mehrere Threads gleichzeitig das File lesen wollen geht die CPU Last erst richtig hoch.
Das ist Unsinn, was du da machst. Mit mehreren Threads aus einer Datei zu lesen bringt keinen Geschwindigkeitsvorteil, weil die Festplatte auch immer nur von einer Stelle lesen und so nur einen Thread jeweils bedienen kann.

Und noch mal, was hast du gegen eine hohe CPU-Auslastung? Wenn die CPU dein Programm ausführen soll, dann muss sie eben arbeiten. Dass andere Programme keine so hohe CPU-Auslastung haben liegt schlicht und ergreifend daran, dass sie zu 99% der Laufzeit nichts tun.

Du scheinst noch nicht zu wissen wie Windows sein Multitasking verwaltet. Lesetipp: http://michael-puff.de/Programmierung/Delphi/Tutorials/
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (22. Sep 2011 um 09:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: while not Eof(myFile), wie CPU Load in den Griff bekommen?

  Alt 22. Sep 2011, 10:05
Das ist Unsinn, was du da machst. Mit mehreren Threads aus einer Datei zu lesen bringt keinen Geschwindigkeitsvorteil, weil die Festplatte auch immer nur von einer Stelle lesen und so nur einen Thread jeweils bedienen kann.
Genau das löst das Auslesen per MMF. Und der Reader lässt sich sehr einfach für das Auslesen der jeweils 4 Zeichen modifizieren.

Aber davon abgesehen gibt es vermutlich eine bessere algorithmische Lösung für die Aufgabe. Was passiert denn in den Threads sonst noch?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 22:12 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