Ho bisogno di leggere e scrivere file binari enormi. c'è un numero preferito o addirittura ottimale di byte (quello che chiamo BLOCK_SIZE
) dovrei read()
alla volta?dimensioni del blocco preferite durante la lettura/scrittura di file binari di grandi dimensioni
1 byte è certamente poco; e non penso che leggere 4GB nella RAM sia una buona idea - c'è una dimensione di blocco "migliore"? o questo dipende anche dal file system (sono su ext4)? cosa devo considerare?
python's open()
fornisce anche un argomento buffering
. dovrei ritoccare anche quello?
questo è il codice di esempio che solo unisce le due file in-0.data
e in-1.data
in out.data
(nella vita reale non v'è più di elaborazione che è irrilevante per la questione a portata di mano). il BLOCK_SIZE
è scelto pari a io.DEFAULT_BUFFER_SIZE
che sembra essere il valore predefinito per buffering
:
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)
Non sono sicuro che esista una risposta definitiva, probabilmente dipendente dal sistema operativo, dal file system e dal disco fisico sulla macchina in questione. Se si intende essere una soluzione generica, è possibile aggiungere del codice per interrogare il sistema in modo che i parametri calcolino la risposta migliore. – cdkMoose
speravo di avere 'interrogato il sistema' usando 'io.DEFAULT_BUFFER_SIZE' - ma non ho davvero esperienza con i dettagli di tutto questo ... –
Non c'è una risposta statica per questo anche su un dato sistema. Dipende da un gran numero di variabili, alcune delle quali possono cambiare nel tempo o essere diverse ogni volta. e cos'altro sta facendo il tuo programma o il tuo sistema. L'approccio migliore potrebbe essere quello di scrivere qualcosa per determinare una buona dimensione in quel momento usando determinati file di test rappresentativi immutabili. In alternativa, è possibile scrivere un test standalone ed eseguirlo una volta per ottenere una stima corretta e quindi eseguire l'hardcode nell'applicazione (o effettuare la parte di test del processo di installazione o di configurazione). – martineau