AGB  ·  Datenschutz  ·  Impressum  







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

Prozedur beschleunigen / Threads?

Ein Thema von Balu der Bär · begonnen am 9. Sep 2009 · letzter Beitrag vom 9. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Balu der Bär
(Gast)

n/a Beiträge
 
#1

Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 09:14
Moin,

eines meiner Projekte tauscht Dateien aus und verändert den Inhalt von anderen Dateien. Das Ganze sieht ungefähr so aus:
Delphi-Quellcode:
GetMD5(datei1);
GetMD5(datei2);
ErsetzeDateiMitAnderer(datei1, datei2); //=Copyfile
Öffne(datei3);
Ersetze(MD5String1 mit MD5String2 in gesamter Datei);//=direktes Schreiben mittels TStream
Schließe(datei3);
Dies Ganze wird circa 15 mal wiederholt, da 15 Dateien getauscht werden müssen und Einträge in datei3 entsprechend geändert werden müssen.

Beim Ersetzen der MD5-Hashes in datei3 wird bitweise vorgegangen, daher dauert dies etwas.

Mein eigentliches Problem ist: Die gesamte Prozedur dauert selbst auf guten Rechnern um die 2 Minuten, eindeutig zu lang.

Jetzt wäre meine Frage wie man dies beschleunigen könnte. Würden Threads etwas bringen? Jedes Mal muss in Datei3 geschrieben werden, es handelt sich hier also nur um eine Datei. Kann ich von 15 Threads aus auf eine Datei zugreifen und diese ändern? Welche anderen Möglichkeiten würde es geben, den Vorgang zu beschleunigen?

Besten Dank
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 09:17
Ich würde einen Thread amchen der in die Datei schreibt und x Threads die die anderen Dateien untersuchen.
die x Threads schieben dann die Informationen die dieser eine Threads braucht in eine Liste welche dieser wiederum abarbeitet.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#3

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 09:35
ev. kann man auch erstmal die 15 Dateien ändern und alles für die Datei3 vormerken und auf einmal erledigen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 09:42
hierbei Threads
Seid ihr irre?
Gleichzeitiges Schreiben/Lesen auf einem Datenträger (wenn es nicht grad eine SSD ist) würde alles wohl eher noch verschlimmern.

- erstmal schauen was so langsam ist
- wie groß sind die Dateien?
- man kann es höchstens verlagern

z.B.

Code:
Öffne(datei3); > in TMemoryStream laden
Loop:
  GetMD5(datei1);
  GetMD5(datei2);
  ErsetzeDateiMitAnderer(datei1, datei2);
  Ersetze(MD5String1 mit MD5String2 in gesamter Datei);
wiederhole Loop;
Schließe(datei3); > den MemoryStream speichern

das Ersetzen der MD5-Werte könnte man parallel zur Bearbeitung (hasching)
der jeweils Nächsten in einem Thread machen
> der Thread für die Festplatte und der für den RAM (TMemoryStream) würden sich weniger gegenseitig stören


mach ich z.B. in meinem SSF so, da läuft ein Thread durch die Liste und fragt einen anderen Thread nach den MD5s von Dateien (dieser führt eine Art Stack mit allen Dateien, die er bekommt und arbeitet sie nacheinander ab und dann gibt es noch den Hauptthread für die GUI ... parktisch immer nur ein Thread für den Datenträger und ein/mehrere Threads für Berechnungen im RAM)

[edit]
man, hab ich langsam geschrieben ... im Prinzip hat schlecki recht und das ist auch der erstmal einfachste Optimierungsweg

was noch ginge, wäre alle MD5s zu merken und sie am Ende in einem Durchgang zu ersetzen.

und ansonsten halt erstmal schauen was so langsam ist ... wie gesagt, threads sind hier eigentlich nicht wirklich sinnvoll und machen nur mehr arbeit, selbst wenn sie sogestaltet sind, daß sie sich nicht gegenseitig behindern.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#5

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 09:59
Zitat:
hierbei Threads
Seid ihr irre?
Gut formuliert!
Genau das richtige Schmankerl für einen lauen Bürotag!
Ralph
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#6

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 10:37
Danke für eure Ideen!

Zitat von schlecki:
ev. kann man auch erstmal die 15 Dateien ändern und alles für die Datei3 vormerken und auf einmal erledigen?
Für den Austausch der Dateien brauche ich die MD5-Hashes nicht. Die sind nur zum Verändern der Datei3 notwendig.

Würde es nun wirklich etwas ausmachen wenn ich erst alle Dateien austausche und dann alles nacheinander in Datei3 schreibe? Kommt das nicht aufs Gleiche raus?

Ihr würdet also einem weiteren Thread tendieren, im Hauptthread wird Datei3 verändert und im zweiten Thread die Dateien ausgetauscht?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 10:52
Zitat von Balu der Bär:
Ihr würdet also einem weiteren Thread tendieren, im Hauptthread wird Datei3 verändert und im zweiten Thread die Dateien ausgetauscht?
neee, ich würde erstmal schauen was so langsam ist und dieses versuchen zu beschleunigen
und dann über alternativen, wie z.B. Threads, nachdenken.

also nochmal ... wie groß sind die Dateien
und wie werden sie derzeit verarbeitet?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#8

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 10:58
Sorry, glatt überlesen.

Die Dateien die andere ersetzen sind maximal 1 MB groß. Ich kopiere die alten Dateien (als Backup) und kopiere dann die neuen Dateien an die alte Stelle (mittels CopyFile).

Die Datei3, in welche geschrieben wird, ist maximal 100KB groß. Diese lade ich in einen TStream und ersetze Bit für Bit den MD5-Hash der alten Datei mit dem Hash der neuen Datei.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 11:06
Bit für Bit? Geht das überhaupt? Aber du weißt doch, wie lang dein Hash ist, dan nkannst du ihn doch in einem Block ersetzen. Warum zeigst du uns nicht endlich mal deinen Code?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#10

Re: Prozedur beschleunigen / Threads?

  Alt 9. Sep 2009, 11:11
Delphi-Quellcode:
procedure TXYZ.Replace(File1: TStream; oldmd5, newmd5: MD5Digest);
var
  i: Integer;
  pos: Int64;
  pattern: MD5Digest;
begin
  File1.Position := 0;
  while (File1.size - File1.position) >= sizeof(MD5Digest) do
  begin
    pos := File1.Position;
    File1.readbuffer(pattern, sizeof(MD5Digest));
    File1.position := pos + 1;
    if (comparemem(@pattern[0], @oldmd5[0], sizeof(MD5Digest))) then
    begin
      File1.position := pos;
      File1.writeBuffer(newmd5, sizeof(MD5Digest));
      break;
    end;
  end;
end;
  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 06:03 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