AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Dateien performant mit Callback kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien performant mit Callback kopieren

Ein Thema von DieDolly · begonnen am 2. Aug 2018 · letzter Beitrag vom 3. Aug 2018
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:40
Nein. Ich denke das ist logisch..
Nöö, das ist alles andere als logisch... Abgesehen von kopieren...

Schau mal hier - OK andere Aufgabenstellung.

Natives lesen ist langsamer als aus einer Datenbank - also ich hätte gewettet das der Datenbankoverhead das ganze viel langsamer macht.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:42
[OT]
Zitat:
dass die ProgressBar sich beim Aktualisieren anders verhält
Man sollte nur zulassen das sich die Progressbar aktualisiert wenn sich die Daten verändert haben der Performance wegen.
Ob du das tust weis ich leider nicht.

Aber hier ein Beispiel.

Delphi-Quellcode:
    Progress := trunc(100 * (Bass_ChannelGetPosition(Channel, BASS_POS_BYTE) / Bass_ChannelGetLength
          (Channel, BASS_POS_BYTE)));

    if (ProgressBar.Value <> Progress) then
      ProgressBar.Value := Progress;
[/OT]

Zitat:
Abgesehen von kopieren...
Und darum ging es mir.. also doch logisch

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:43
Der beste Buffer scheint also irgendwo zwischen 30 und 50 MB zu liegen. jedenfalls für HDDs. Bei guten SSDs kann man meiner Meinung nach bei 100 MB anfangen.
Das Buffer solle immer aligned sein und zur Sektor-Größe passen.

Siehe
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:47
Wenn ich ohne Buffering von Windows und einer Buffergröße von 10 MB bei ReadFile eine 1 GB-Datei kopiere, dauert das rund 30 Sekunden.
Mit 256 KB Buffer 40 Sekunden.
Mit einem 100 MB Buffer 22 Sekunden - genau so schnell wie Windows.
Dazu hätte ich gerne mal Dein Testprogramm...
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#25

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:48
Der beste Buffer scheint also irgendwo zwischen 30 und 50 MB zu liegen. jedenfalls für HDDs. Bei guten SSDs kann man meiner Meinung nach bei 100 MB anfangen.
Das Buffer solle immer aligned sein und zur Sektor-Größe passen.
Da man ja nie weiß wie groß der Sektor einer Festplatte ist, denn es gibt ja tausende Verschiedene Platten, und 50 MB irgendwo ein Vielfaches von 512, 1024, 2048 oder 4096 ist, macht man da mit 50 MB was falsch?

Zitat:
Man sollte nur zulassen das sich die Progressbar aktualisiert wenn sich die Daten verändert haben der Performance wegen.
Sowas ist ein Muss.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#26

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:51
Da man ja nie weiß wie groß der Sektor einer Festplatte ist, denn es gibt ja tausende Verschiedene Platten, und 50 MB irgendwo ein Vielfaches von 512, 1024, 2048 oder 4096 ist, macht man da mit 50 MB was falsch?
Ähm... vieles. Und die Sektorengröße kann man schließlich einfach ermitteln. Einfach mal in der DP suchen.

Aber ich verstehe nicht, warum Du nicht die Windows-Hausmittel nutzt, die sind i.A. sehr performant und darauf optimiert sich an die jeweiligen System anzupassen.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#27

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:52
Eine Datei in einem Rutsch mit CopyFile zu kopieren ist doch zu einfach.
Was mich an der Sache interessiert ist der CallBack und immer auf dem Laufenden zu sein, wieviel gerade kopiert wurde.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:52
Zitat:
Sowas ist ein Muss.
Nur ich sehe immer wieder das es viele halt nicht tun.. aber sei's drum.
War nur ein Tip.
Zitat:
Aber ich verstehe nicht, warum Du nicht die Windows-Hausmittel nutzt, die sind i.A. sehr performant und darauf optimiert sich an die jeweiligen System anzupassen.


gruss
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#29

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 14:57
Zitat:
Ähm... vieles. Und die Sektorengröße kann man schließlich einfach ermitteln. Einfach mal in der DP suchen.
Finde dazu genau nichts.

Könnt ihr mir vielleicht ein Beispiel zeigen was ihr mit Hausmitteln meint? Damit meine ich kein simples CopyFile.
Sondern irgendwas mit einem CallBack, sodass ich immer auf dem Laufenden bin und den Kopiervorgang auch von Außen abbrechen kann.

Aktuell nutze ich alte Windowsmittel, die viele verfluchen. Ich sag nur Block-Methoden.
Da ich hier aber eine Schleife habe, kann ich wann immer ich möchte abbrechen.

Edit
mein Problem mit dem CopyFileEx-Callback ist, dass ich nicht weiß wie ich die kopierten Bytes hochzählen kann.
TInterlocked.Add(OverallBytesCopied, ....); // TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred ? Bei einer Datei könnte ich OverallBytesCopied := TotalBytesTransferred; schreiben. Aber bei mehreren geht das nicht denke ich.

Delphi-Quellcode:
procedure CopyCallBackTEST(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle); stdcall;
begin
 if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
  begin
   if not CancelCopy then
    begin
     TInterlocked.Add(OverallBytesCopied, ...);
    end;
  end;
end;

Result := CopyFileEx(PChar(Source), PChar(Dest), @CopyCallBackTEST, nil, @CancelCopy, 0);

Geändert von DieDolly ( 3. Aug 2018 um 15:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 15:51
Wenn Du schon weißt was Du willst, dann nutz es doch:
http://www.pinvoke.net/default.aspx/kernel32.CopyFileEx

Falls Du mehr Performance willst, dann mußt Du erst einmal alle möglichen Scenarien aufbauen, z.B. Copy auf ein und der selben Festplatte, copy von Festplatte1 auf Festplatte2 usw.
Und dann für jedes Deiner Scenarien eine eigene Routine schreiben.
(Ob da jetzt der (Daten)Bus oder der Festplatten-Controler der Flaschenhals ist, ist dann Thema für den 3.Grad)
Übrigens konnte man früher SCSI-Festplatten Vom SCSI-Controler kopieren lassen. Da ging die Luzy wirklich ab. War nur ein wenig aufwendig die Parameter richtig zu bestimmen. Und war nicht ganz trivial.
Die beim Kopiervorgang eingesparte Zeit hat den Programmieraufwand nie aufgewogen.

Wenn Du nicht eine ganz spezielle Anwendung im Sinn hast, dann laß das Betriebssystem seine Arbeit machen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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:21 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