"Chunk Size" zum lesen/schreiben von Dateien. Wie groß?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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, …
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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
       
Antworten