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
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 05:47
Ein gibt garnichts, was am Performantesten ist.
Zumindest nannte ich eine tödlich-performante Variante, jedes Byte in GUI darstellen, da verlagert sich dann der Flaschenhals nach GUI.
Sei's drum, Du kannst jeden Thread eine Message mit dem aktuellen Stand des Kopiervorgangs schicken lassen
Solange es Lokal "fest verkabelt" und nicht über LAN (o.ä.) stattfindet, Rate ich davon ab, Flaschenhals ist bei Kopierprozessen idR der BUS.


Meine Erfahrungen mit selbst gezüchteten Kopiertechniken:
  • Eine non-Cached Variante verliert idR bei Performance-Tests immer.
  • Eine multi-Thread Variante scheitert meist am BUS Flaschenhals, da kann man auch die Kerne im Vorfeld auslesen und dementsprechend Threads verteilen, es passt nunmal nur eine Gewisse Menge an Daten zwischen den BUS.
  • eine cached Variante mit 4kb ist sehr flott, bei 64kb blöcken habe ich in meinem System die beste Kopier-Rate.
  • Kopier-Programme die im Vorfeld verbaute Caches ermitteln kenne ich persönlich noch nicht, das wäre mal eine Herausfordernung.
  • Für eine ProgressBar kommt aus meiner Sicht nur eine Prozent-Anzeige in Frage, ich selbst nutze eine 5% Variante, habe noch keine Nachteile feststellen können. (alle +5% aktualisiert sich meine GUI)
  • Ich selbst erstelle/nutze einen Kopier-Thread, damit GUI entlastet wird.

Sinnvolle Anzeigen für GUI:
  • ProgressBars für kompletten Vorgang und aktueller Datei (für Multi-Copy)
  • Labels für alle Bytes, kopierte Bytes; dazu vielleicht noch ein Label mit Rest-Kopier-Dauer?
  • Label für Dateinamen (bei Multi-Copy erscheint bei mir noch ein Label mit Pfad)
  • Abbrechen Knopf

Sinnvolle non-Visual Dinge:
  • Hash/CRC Kontrolle zum verifizieren der Daten.
  • Für cache Varianten könnten hier zusätzliche Manipulatoren eingeplant werden. Komprimierung/Verschlüsselung zum Beispiel. Je nach Sinn und Zweck.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 3. Aug 2018 um 05:50 Uhr)
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#2

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 08:20
Mit CopyFileEx()?

http://delphidabbler.com/tips/160
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 08:43
Zitat:
Zumindest nannte ich eine tödlich-performante Variante
Tödlich ist das richtige Wort.

Versuche mal mit sowas mehrere GB an Daten zu kopieren.
Windows bevorzugt per Standard den FileCache, kopiert durch den FileCache und da der LeseCache auch nach dem vollständigen Schreiben erhalten bleibt, schmeißt es somit ALLE Programme aus dem RAM in die PageFile und dein System wird sowas von ausgebremst, dass es richtig Spaß macht.

Bei FileStreams könntest DU wenigstens noch angeben, dass es sich um sequentielle Zugriffe handelt, damit Windows den Cache entsprechend optimieren könnte (wenn es das mal macht), aber da ist es einfacher die Kopierfunktionen der WinAPI zu nutzen, wo dessen Entwickler sowas hoffentlich beachtet haben.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Aug 2018 um 09:01 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 09:00
Ach Leute Copy und vergleichbares, verstehe die Diskussion nicht.
Zitat:
Ein gibt garnichts, was am Performantesten ist.
Performanter als das System Daten kopiert gibt es eh nicht.
Und welche variante von Copy man verwendet ist letztendlich uninteressant.

gruss

Geändert von EWeiss ( 3. Aug 2018 um 09:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 13:10
Performanter als das System Daten kopiert gibt es eh nicht.
Getestet oder nur geschätzt?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 13:16
Performanter als das System Daten kopiert gibt es eh nicht.
Getestet oder nur geschätzt?
Ich denke ist wohl abhängig von vielen Dingen.. Hardware, System, Software.
Sollte die Software schneller sein beim kopieren als das System selbst? Möchte ich bezweifeln.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 13:24
Sollte die Software schneller sein beim kopieren als das System selbst? Möchte ich bezweifeln.
Also geschätzt.

Ich denke, das eine optimierte Software schnelle sein kann als das System. Der System copy process muss sehr variable und auf viele Faktoren "achten"...

Ich kann mich gut daran erinnern, dass es immer Software gab, die abhängig von der Festplatte ausgerechnet hat wann und wie schnell die Festplatte sich dreht und genau ausgerechnet hat, wann ein Track in einer Umdrehung gelesen werden kann. (Bei Floppy's waren da die größte Unterschiede).

Ich denke, wenn ich einen großen Block RAM reserviere (Physikalisch nicht über die Swap Datei) und dann in einem Rutsch 1GB lade und schreibe ohne jeden test ob Festplatte voll usw. dann ist das schneller als ein Copy vom System.

Aber getestet hab ich es auch nicht (in letzter Zeit)…
  Mit Zitat antworten Zitat
DieDolly

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 12:22
Zitat:
Zumindest nannte ich eine tödlich-performante Variante
Tödlich ist das richtige Wort.

Versuche mal mit sowas mehrere GB an Daten zu kopieren.
Windows bevorzugt per Standard den FileCache, kopiert durch den FileCache und da der LeseCache auch nach dem vollständigen Schreiben erhalten bleibt, schmeißt es somit ALLE Programme aus dem RAM in die PageFile und dein System wird sowas von ausgebremst, dass es richtig Spaß macht.

Bei FileStreams könntest DU wenigstens noch angeben, dass es sich um sequentielle Zugriffe handelt, damit Windows den Cache entsprechend optimieren könnte (wenn es das mal macht), aber da ist es einfacher die Kopierfunktionen der WinAPI zu nutzen, wo dessen Entwickler sowas hoffentlich beachtet haben.
Ich habe gerade eben mal mit CreateFile und alten Dateizugriffsfunktionen geprüft, ob es einen Unterschied macht FILE_FLAG_NO_BUFFERING zu nutzen oder nicht.
Mit FILE_FLAG_NO_BUFFERING dauert das erste Kopieren einer 1 GB Datei von E nach E 30 Sekunden. Danach Wieder 30 Sekunden.
Ohne den NO_Buffering-Parameter erst 30 Sekunden und danach wenn überhaupt eine Sekunde.

Würde das System theoretisch sehr viel langsamer werden wenn ich 25 x 1 GB ohne den No-Buffering-Parameter kopiere?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 12:49
Wie gesagt, was "optimaler" ist, das hängt von den Umweltbedingungen ab.

Und es gibt einen Unterschied ob das Kopieren "gefühlt" schnell ist, aber im Hintergrund noch weiterläuft, weil es nur in den Cache geschrieben wurde und der dann verzögert erst auf der Platte landet ... das merkst du dann, wenn du noch mehr kopierst.
Das "komplette" Schreiben dauert hierbei so oder so durchschnittlich gleich lang.

ABER, wenn es durch den FileCache den RAM "überfüllt" und du mehr kopierst, als RAM frei ist, dann werden andere Dinge ausgebremst und auch das Kopieren wird ab diesem Zeitpunkt langsamer und das sogar langsamer als ohne FileCache, also wenn man dessen Behandlung ganz umgehen würde.



Beim blosen Kopieren kann das Kopieren mit FileCache "gefühlt" schneller sein, aber insgesamt wird immer irgendwas ausgebremst, sobald nicht genügend RAM frei ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Aug 2018 um 12:51 Uhr)
  Mit Zitat antworten Zitat
DieDolly

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

AW: Dateien performant mit Callback kopieren

  Alt 3. Aug 2018, 12:54
Verständlich erklärt. Eigentlich kann man sogar festhalten, dass es für Netbooks vom alten Schlag besser ist ohne Buffer zu kopieren. Denn die haben ohnehin nicht viel RAM.
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz