Seite 1 von 1
"Chunk Size" zum lesen/schreiben von Dateien. Wie groß?
Verfasst: Donnerstag 7. Januar 2016, 11:57
von jens
Für mein Backup Tool, hab ich (zusammengekürzt, ohne SHA Berechnung) eine Schleife wie diese:
Code: Alles auswählen
with open(src_filepath, "rb") as in_file:
with open(dst_filepath, "wb") as out_file:
while True:
data = in_file.read(chunk_size)
if not data:
break
out_file.write(data)
process_bar.update(len(data))
Dabei kann man
chunk_size frei konfigurieren und Standard aktuell 64KB... Quasi Frei gewählt. Doch welche größe eignet sich mehr?!?
Eine Überlegung: i.d.R. kann man schon mit min. 5-10MB/s rechnen (Wenn es wirklich langsam ist) Also warum nicht eine Blockgröße von 5-10MB nehmen, dann würde
process_bar.update() mindestens einmal die Sekunde aktualisiert...
Oder was dynamisches? Schauen wie lange der letzte Durchgang gedauert hat und zahl erhöhen, wenn es schneller als 1Sek. war?!?
Re: "Chunk Size" zum lesen/schreiben von Dateien. Wie groß?
Verfasst: Sonntag 24. April 2016, 15:07
von BlackJack
@jens: Das kann von (zu) vielen Faktoren abhängen. Datendurchsatz bei Quelle und Ziel, ob beides auf dem selben Datenträger liegt, Netzwerk dazwischen ja/nein, Netzauslastung, Speicherauslastung, welche CPU- und/oder IO-Last bei dem/den Rechnern gerade herrscht, …
Re: "Chunk Size" zum lesen/schreiben von Dateien. Wie groß?
Verfasst: Sonntag 24. April 2016, 18:41
von DasIch
Was ist überhaupt dein Ziel? Wenn ich alle x Minuten oder sogar kontinuierlich Backups mache dann soll sich mein Backup Tool mit den Resourcen schon etwas zurückhalten, zumindest solange ich noch irgendwas anderes mache. Wenn ich meinen Raum heizen will lass ich einen Bitcoin Miner und kein Backup laufen.
Re: "Chunk Size" zum lesen/schreiben von Dateien. Wie groß?
Verfasst: Mittwoch 27. April 2016, 11:32
von jerch
@jens:
Deine Funktion ist ja eine klassische Datenschaufel. Da ist es generell so, dass so wenig wie möglich Logik dazwischen hängen sollte (kannst Dir ja selbst ausrechnen, wie oft Dein `process_bar.update` bei verschiedenen Chunkgrößen für mehrere GB an Daten aufgerufen wird). Ich würde das ganz rausnehmen, die Chunkgröße relativ groß wählen (das wird vom OS eh je nach anliegenden Pipes zwei Ebenen tiefer in kleinere Pakete zerlegt) und maximal eine simple Speicherzugriffaktion draus machen, z.B. die Chunkanzahl bei bekannter Größe mitzählen. Damit wird der Datendurchsatz relativ wenig "ausgebremst".
Wenn dann irgendwer den Fortschritt auslesen möchte, kann er die Chunkanzahl nebenläufig auslesen und zur Anzeige bringen. Auch denke ich, dass bei einem Backupprogramm ein "hot progress status" nicht von großem Interesse ist und Du eher lange Aktualisierungsintervalle des Fortschritts wählen kannst. Backupprogramme sollten mit wenig Ressourcenanspruch und geringer Priorität im Hintergrund mitlaufen und die normalen Benutzeraktionen so wenig wie möglich beeinträchtigen.
Re: "Chunk Size" zum lesen/schreiben von Dateien. Wie groß?
Verfasst: Mittwoch 27. April 2016, 13:22
von jerch
@jens:
Was ich vergessen hatte - Du kannst auch einfach die tatsächlich geschriebenen Bytes mitzählen. Die gibt Dir z.B. `write` zurück:
Code: Alles auswählen
with open(..., 'rb') as reader:
with open(..., 'wb') as writer:
total_bytes = 0
bytes_written = 0
while True:
bytes_written = writer.write(reader.read(CHUNKSIZE))
if not bytes_written:
break
total_bytes += bytes_written