Ho un set di punti dati, ciascuno descritto da un dizionario. L'elaborazione di ciascun punto di dati è indipendente e invio ciascuno come un lavoro separato a un cluster. Ogni punto di dati ha un nome univoco e il mio wrapper di invio di cluster chiama semplicemente uno script che prende il nome di un punto di dati e un file che descrive tutti i punti di dati. Lo script quindi accede al punto dati dal file ed esegue il calcolo.Serializzazione JSON veloce (e confronto con Pickle) per il cluster computing in Python?
Poiché ogni lavoro deve caricare l'insieme di tutti i punti solo per recuperare il punto da eseguire, ho voluto ottimizzare questo passaggio serializzando il file che descrive l'insieme di punti in un formato facilmente recuperabile.
Ho provato ad utilizzare JSONpickle, utilizzando il seguente metodo, per serializzare un dizionario che descrive tutti i punti dati al file:
def json_serialize(obj, filename, use_jsonpickle=True):
f = open(filename, 'w')
if use_jsonpickle:
import jsonpickle
json_obj = jsonpickle.encode(obj)
f.write(json_obj)
else:
simplejson.dump(obj, f, indent=1)
f.close()
Il dizionario contiene oggetti molto semplici (liste, stringhe, galleggianti, ecc) e ha un totale di 54.000 chiavi. Il file json ha una dimensione di ~ 20 Megabyte.
Ci vogliono circa 20 secondi per caricare questo file in memoria, il che mi sembra molto lento. Sono passato a usare pickle con lo stesso oggetto esatto e ho scoperto che genera un file di circa 7,8 megabyte e può essere caricato in ~ 1-2 secondi. Questo è un miglioramento significativo, ma sembra che il caricamento di un oggetto di piccole dimensioni (meno di 100.000 voci) sia più veloce. A parte questo, pickle non è leggibile dall'uomo, il che è stato il grande vantaggio di JSON per me.
C'è un modo per utilizzare JSON per ottenere aumenti di velocità simili o migliori? Se no, hai altre idee su come strutturare questo?
(È la soluzione giusta per "tagliare" semplicemente il file che descrive ogni evento in un file separato e passarlo allo script che esegue un punto dati in un lavoro di cluster? Sembra che ciò potrebbe portare a una proliferazione di File).
grazie.
Grazie mille per la tua risposta informativa, che è stata molto utile. Quali basi di dati consiglieresti in Python? Preferisco di gran lunga cose che non richiedono server di database stand-alone - o ancora meglio che sono integrati in Python, forse come sqlite - su quelli che lo fanno. Qualche idea su questo? Un approccio al database in Python potrebbe rivaleggiare con i tempi di pickle per il caso di test di un dizionario per ~ 50.000 chiavi in cui devi separare una particolare voce da esso? Se passo a un DB, scriverò codice personalizzato per serializzarlo in CSV in modo che i miei file possano essere condivisi e letti da altri utenti umani. – user248237dfsf
Se si utilizza un DB incorporato, sqlite è il migliore, ma come qualsiasi altro DB incorporato non vi offre alcuna elaborazione parallela, ma in questo caso è il punto di forza delle prestazioni del metodo DB. Quanto è difficile eseguire un processo PostgreSQL, dopo tutto? E ora puoi ottenere una perfetta parallelizzazione dell'accesso ai dati e un notevole incremento delle prestazioni. (Scrivere CSV o altri moduli su un DB SQL e riportare il contenuto del DB a qualsiasi forma di tuo gradimento, è un lavoro facile con semplici script ausiliari, ovviamente - che è indipendente dal motore DB che scegli). –