Ich muss lesen und schreiben riesige Binärdateien. Gibt es eine bevorzugte oder sogar optimale Anzahl von Bytes (was ich BLOCK_SIZE
anrufen) ich sollte read()
zu einer Zeit?bevorzugte Blockgröße beim Lesen/Schreiben von großen Binärdateien
1 Byte ist sicherlich zu wenig; und ich glaube nicht, 4GB in den RAM zu lesen ist auch eine gute Idee - gibt es eine "beste" Blockgröße? oder hängt das sogar vom Dateisystem ab (ich bin auf ext4)? Was muss ich beachten?
python's open()
bietet sogar ein buffering
Argument. Würde ich das auch noch verbessern müssen?
Dies ist ein Beispielcode, der nur die beiden Dateien in-0.data
und in-1.data
in out.data
verbindet (im wirklichen Leben gibt es mehr Verarbeitung, die für die Frage irrelevant ist). die BLOCK_SIZE
gleich io.DEFAULT_BUFFER_SIZE
gewählt, die der Standard für buffering
zu sein scheint:
from pathlib import Path
from functools import partial
DATA_PATH = Path(__file__).parent/'../data/'
out_path = DATA_PATH/'out.data'
in_paths = (DATA_PATH/'in-0.data', DATA_PATH/'in-1.data')
BLOCK_SIZE = 8192
def process(data):
pass
with out_path.open('wb') as out_file:
for in_path in in_paths:
with in_path.open('rb') as in_file:
for data in iter(partial(in_file.read, BLOCK_SIZE), b''):
process(data)
out_file.write(data)
# while True:
# data = in_file.read(BLOCK_SIZE)
# if not data:
# break
# process(data)
# out_file.write(data)
Nicht sicher, dass es eine definitive Antwort dafür gibt, wahrscheinlich abhängig von Betriebssystem, Dateisystem und physikalischer Festplatte auf dem fraglichen Rechner. Wenn dies eine allgemeine Lösung sein soll, möchten Sie möglicherweise Code hinzufügen, um das System nach Parametern abzufragen, um die beste Antwort zu berechnen. – cdkMoose
Ich hatte gehofft, das System mit 'io.DEFAULT_BUFFER_SIZE' abgefragt zu haben - aber ich habe wirklich keine Erfahrung mit den Details von all dem ... –
Es gibt keine einzige statische Antwort für dieses sogar auf einem gegebenen System. Es hängt von einer großen Anzahl von Variablen ab, von denen sich einige im Laufe der Zeit ändern oder jedes Mal anders sein können. sowie was sonst noch Ihr Programm oder das System macht. Der beste Ansatz könnte darin bestehen, etwas zu schreiben, um eine gute Größe zu bestimmen, indem bestimmte unveränderliche repräsentative Testdateien verwendet werden. Alternativ können Sie einen eigenständigen Test schreiben und ihn einmal ausführen, um einen guten Kostenvoranschlag zu erhalten und ihn dann in Ihre Anwendung zu codieren (oder den Testteil des Installations- oder Einrichtungsprozesses zu machen). – martineau