"Effizienteste" Kopierroutine für eine große Datei

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ok, da könnte er sich wirklich fürchterlich verschrieben haben, aber auch sonst vertan
> und den Rest (wie zum Beispiel bei einer 5MB-Date ^^) dann halt mit normalen Schritten


auf jeden fall danke für deinen hinweis, dass die Clustergröße nach wie vor 4KB beträgt.
(wobei mir das irgendwie spanisch vorkommt, ich hab da was mit 16KB im hinterkopf)

dass clusterweise lesen und schreiben vorteile bringt, ist einleuchtend.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Kaeru Gaman hat geschrieben: auf jeden fall danke für deinen hinweis, dass die Clustergröße nach wie vor 4KB beträgt.
(wobei mir das irgendwie spanisch vorkommt, ich hab da was mit 16KB im hinterkopf)
Hab ich grade eben bei Microsoft nachgelesen: http://technet2.microsoft.com/WindowsSe ... x?mfr=true
Wenn die es nicht wissen, wehr dann? :)
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Also von der Erfahrung her, kommt man mit einem 4069 Byte Stack und 4KB großen Blocken (Stringgröße auf 4KB gesetzt) im Netzwerk wie auch Lokal auf die besten Durchsätze.

Vielleicht hat sich das mittlerweile geändert, aber wenn sich an der Clustergröße nicht so viel geändert hat, würde mich das wundern.
Natürlich ist das alles lange her, aber so viel hat sich an Allem nun auch wieder nicht geändert.

Ins Blaue geraten..?
Eigentlich nicht. Kannst dich ja mit ner Stoppuhr mal an sowas ransetzen. Mein Chef hat das "damals" auch gemacht. Also ganz unbegründet würde ich meine Ansätze nicht sehen.

Gr33tz
Tafkadasom2k5

Edit:
Microsoft Corp. hat geschrieben:Clusters and Sectors on an NTFS Volume

[...]
For example, on a disk that uses 512-byte sectors, a 512-byte cluster contains one sector, whereas a 4-kilobyte (KB) cluster contains eight sectors.
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Diese KopierAPI mit Fortschrittsanzeige ist natürlich sehr lahm, da alles
Häppchenweise geht, wobei dann noch die Ereignisse bearbeitet werden.
Wenn das nicht nötig ist, ist CopyFile Dein Freund (am besten mit PB4)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag von pvmichael »

ts-soft hat geschrieben:Diese KopierAPI mit Fortschrittsanzeige ist natürlich sehr lahm, da alles
Häppchenweise geht, wobei dann noch die Ereignisse bearbeitet werden.
Wenn das nicht nötig ist, ist CopyFile Dein Freund (am besten mit PB4)
Danke, das ist doch mal eine Aussage, mit der ich was anfangen kann :)

Allerdings ist eine Fortschrittsanzeige schon wichtig, gerade weil ich damit Dateien ~ 2000MB kopieren möchte, und der User wissen soll, wann das fertig ist. Ok, ich könnte auch danach einen Message Requester machen, hmmm.... mal überlegen
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Also ich persönlich finde es auch immer interessanter, wenn ein Ladebalken, Prozente oder zumindest die Restzeit angezeigt wird. Notfalls tut's auch die Geschwindigkeit, sodass ich mir die Restzeit selber ausdenken kann (obwohl das dann auch gleich das Programm erledigen kann).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

pvmichael hat geschrieben:Danke, das ist doch mal eine Aussage, mit der ich was anfangen kann :)
Darf ich fragen, was an meiner so schwer zu verstehen war? :? :(
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Tafkadasom2k5 hat geschrieben:
pvmichael hat geschrieben:Danke, das ist doch mal eine Aussage, mit der ich was anfangen kann :)
Darf ich fragen, was an meiner so schwer zu verstehen war? :? :(
Versteh ich auch net!
Muss es denn immer was mundgerecht vorgefertigtes sein?
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Beitrag von pvmichael »

Tafkadasom2k5 hat geschrieben:
pvmichael hat geschrieben:Danke, das ist doch mal eine Aussage, mit der ich was anfangen kann :)
Darf ich fragen, was an meiner so schwer zu verstehen war? :? :(
Weil ich kaum glaube, dass es schneller geht, wenn ICH anfange die Datei in 4096KB großen Blöcken auszulesen, um sie dann wieder zu schreiben. Es mag sicher Leute unter euch geben, die das können, aber ich gehöre sicher nicht dazu. Ich hab mit diesen ganzen Buffern eh schon so meine Probleme, egal ob Dateibuffer oder Netzwerkbuffer.

Die Aussage von ts-soft war für mich insofern verständlich, dass er mir empfahl CopyFile zu verwenden, und dabei noch den Tipp das mit PB4 zu machen.

Es war nicht böse gemeint, als ich sagte, dass ich mit dieser Aussage etwas anfangen kann... wollte damit eigentlich nur sagen, dass ICH damit was anfangen kann, evtl. können ja andere mit Deiner Erklärung etwas anfangen und sogar bessere Ergebnisse erzielen, auf mich trifft das nur leider nicht zu.
CelAthor
Beiträge: 6
Registriert: 16.06.2006 10:01

Beitrag von CelAthor »

Man kann schon seit längerem die Clustergröße individuell festlegen, natürlich kann man dabei nur aus vorgegebenen Werten wählen.
Die Clustergröße sollte sich nach der Größe der Partition richten.
Auch sollte man diese nicht zu hoch ansetzen, denn dann bekommt man Probleme bei sehr vielen kleinen Dateien. Denn die kleinste Datei ist immer so groß, wie der Cluster.

Folgender Algorythmus zum Kopierthema:
Man lege zuerst eine Buffergröße fest (z.B. 50MB), dann prüft man, ob die Datei diese Größe übersteigt oder nicht. Ist die datei größer, werden solange 50MB-Blöcke kopiert bis die Restgröße der Datei kleiner als 50MB ist. Dann passt man den Buffer auf die Restgröße an und kopiert den letzten Teil.
Wichtig ist hier aber, die Größe des Buffers nicht zu hoch auszuwählen. Denn je höher, desto länger braucht Windows um die Daten einzulesen.
Stellt man den Buffer zu klein, ist Windows mehr mit den Verwaltungsoperationen beschäftigt.
Antworten