Abbiamo un server Web basato su Python che designa un numero di file di dati di grandi dimensioni all'avvio usando cPickle
. I file di dati (decapitati usando HIGHEST_PROTOCOL
) sono circa 0,4 GB su disco e vengono caricati in memoria come circa 1,2 GB di oggetti Python - questo richiede circa 20 secondi. Stiamo usando Python 2.6 su macchine Windows a 64 bit.Come deserializzare 1GB di oggetti in Python più velocemente di cPickle?
Il collo di bottiglia non è certamente il disco (ci vogliono meno di 0,5 secondi per leggere effettivamente tanti dati), ma l'allocazione della memoria e la creazione dell'oggetto (ci sono milioni di oggetti creati). Vogliamo ridurre gli anni '20 per ridurre i tempi di avvio.
C'è un modo per deserializzare più di 1 GB di oggetti in Python molto più veloce di cPickle
(come 5-10x)? Poiché il tempo di esecuzione è legato all'allocazione della memoria e alla creazione dell'oggetto, presumo che l'uso di un'altra tecnica di disaccoppiamento come JSON non sarebbe di aiuto in questo caso.
So che alcuni linguaggi interpretati hanno un modo per salvare l'intera immagine di memoria come un file su disco, in modo che possano caricarli nuovamente in memoria tutto in una volta, senza allocazione/creazione per ciascun oggetto. C'è un modo per fare questo, o raggiungere qualcosa di simile, in Python?
Questa potrebbe essere la tua occasione per ottenere un'unità a stato solido. È questo per accelerare dev? Per consentirti di effettuare implementazioni rapide? Il ritardo nella lettura dei dati o nella deselezione? Se inizi con un'istanza vuota, qual è l'ora di avvio? – Scott
Nota che nella mia domanda ho menzionato che il collo di bottiglia non è la velocità di avanzamento/lettura, ma la velocità di estrazione e di creazione dell'oggetto. È più per le implementazioni rapide - per consentire al nostro server di riavviare rapidamente. Non sono abbastanza sicuro di cosa intendi con "istanza vuota" qui. –
Per un file binario di pickle da 750 MB, l'impostazione della chiamata di carico cPickle con gc.disable()/gc.enable() ha ridotto drasticamente il tempo totale richiesto di circa 20 volte. Vedi [qui] (http://stackoverflow.com/a/36699998/2385420) –