[Python] sqlite executemany ed utilizzo/saturazione della memoria...

Valerio Maggio valerio.maggio a gmail.com
Ven 1 Nov 2013 19:34:24 CET


On 31 Oct 2013, at 23:43, Pietro Zambelli <peter.zamb a gmail.com> wrote:

> On Thursday 31 Oct 2013 21:17:24 Pietro wrote:
> > quindi ora sto trasformando il mio codice per farlo assomigliare al mio
> > codice d'esempio e vediamo se riesco a capire cosa non andava.
>  
> sono riuscito a completare l'operazione, anche se al limite della memoria... temo sia necessario un ripensamento della struttura della (mia) libreria :-P
>  
> Credo che il problema sia dovuto al "circular reference". Io ho scoperto questo problema, questa sera... :-)
>  
> Quanto è "pericoloso", avete letture o link consigliati sull’argomento?

Dalla tua risposta, non credo di aver capito a cosa si riferisca la “circular reference”. In particolare, non ho ben chiaro se sia relativa agli import dei tuoi moduli, alle reference tra gli oggetti o (come l’avevo intesa la prima volta che ho letto il tuo post)
al modello dei dati che hai realizzato (e implementato in SQLite).

Se le circular-reference riguardano il codice o gli import dei moduli, se cerchi in Google, troverai una marea di discussioni e argomentazioni a riguardo. Una su tutte, ti segnalo questo post su Stackoverflow [0], la cui BA punta ad un post su
comp.lang.python da leggere.

Se, invece, la circular-reference riguarda il modello dei dati, allora ti condivido i miei 2 cents.
Innanzitutto, le circular reference in un modello relazionale sono espresse mediante relazioni ricorsive. Le relazioni ricorsive sono ampiamente supportate dal formalismo, ma il loro supporto “concreto” varia da implementazione (del DBMS) a implementazione.
Ora, non saprei dirti nello specifico se e come SQLite gestisca le relazioni ricorsive, ma se proprio non riesci a semplificare il tuo modello e hai vincoli tecnologici legati all’uso di un Db-SQL, allora prova alternative *migliori* tipo PostgreSQL.
In soldoni, la domanda che mi porrei io fossi in te è: "la normalizzazione dei dati è necessaria? Mi da qualche vantaggio?"

Se, al contrario, SQLite è la “prima” soluzione di memorizzazione che ti è venuta in mente di usare e potresti in linea di principio rimpiazzarla con altro, io andrei di HDF5 o di MongoDB.

La /rule of thumb/ da seguire, imho, è la seguente: se vuoi rimanere su memorizzazione file-based, senza dover mettere su server e servizi, HDF5 [1] è la soluzione. Inoltre, HDF5 ti dà l’enorme vantaggio di essere *molto* più efficiente rispetto a MONGO in termini di storage (i.e., spazio su disco), considerando che si possono anche applicare algoritmi di compressione sul file.

Al contrario, MongoDB [2] vince su HDF5 in termini di performance (query time - insert/select/update).

In entrambi i casi (che te lo dico a fare :-), l’integrazione con Python è semplicissima. Per HDF5 hai due soluzioni: la più nota PyTables [3] o h5py [4].
Per MongoDB, invece, c’è pymongo [5]

Ciao.
Valerio


—
[0]: http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python
[1]: http://www.hdfgroup.org/HDF5/
[2]: http://www.hdfgroup.org/HDF5/
[3]: http://www.pytables.org/moin
[4]: https://pypi.python.org/pypi/h5py
[5]: http://api.mongodb.org/python/current/


-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20131101/eabe679e/attachment.html>


Maggiori informazioni sulla lista Python