Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Dateien performant mit Callback kopieren (https://www.delphipraxis.net/197377-dateien-performant-mit-callback-kopieren.html)

himitsu 3. Aug 2018 08:43

AW: Dateien performant mit Callback kopieren
 
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.

EWeiss 3. Aug 2018 09:00

AW: Dateien performant mit Callback kopieren
 
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

DieDolly 3. Aug 2018 12:22

AW: Dateien performant mit Callback kopieren
 
Zitat:

Zitat von himitsu (Beitrag 1409590)
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?

himitsu 3. Aug 2018 12:49

AW: Dateien performant mit Callback kopieren
 
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.

DieDolly 3. Aug 2018 12:54

AW: Dateien performant mit Callback kopieren
 
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.

Mavarik 3. Aug 2018 13:10

AW: Dateien performant mit Callback kopieren
 
Zitat:

Zitat von EWeiss (Beitrag 1409592)
Performanter als das System Daten kopiert gibt es eh nicht.

Getestet oder nur geschätzt?

EWeiss 3. Aug 2018 13:16

AW: Dateien performant mit Callback kopieren
 
Zitat:

Zitat von Mavarik (Beitrag 1409632)
Zitat:

Zitat von EWeiss (Beitrag 1409592)
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

Mavarik 3. Aug 2018 13:24

AW: Dateien performant mit Callback kopieren
 
Zitat:

Zitat von EWeiss (Beitrag 1409633)
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)…

EWeiss 3. Aug 2018 13:27

AW: Dateien performant mit Callback kopieren
 
Zitat:

Also geschätzt.
Nein. Ich denke das ist logisch.. (aber desweiteren geschätzt. Ja ;) )
Wie gesagt es gibt viele Faktoren.. Einer der größten mag dein Virenscanner sein ;)

gruss

DieDolly 3. Aug 2018 13:37

AW: Dateien performant mit Callback kopieren
 
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.

Aber bei 100 MB merkt man, dass die ProgressBar sich beim Aktualisieren anders verhält. Es werden keine kleinen Sprünge mehr gemacht sondern jede Sekunde ein großer.
Ein 50 MB Buffer ist auch OK und eine 1 GB Datei ist nach 22 bis 23 Sekunden kopiert.

Wenn man ReadFile und WriteFile nimmt, dann ist ein 100 MB Buffer am schnellsten. je kleiner, desto länger dauert es.
Ich lese von einer mechanischen HDD und schreibe auf genau dieselbe für meine Tests.

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.
Seite 2 von 4     12 34      

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