[Python] Aggiornare file pickle

2011-05-10 Per discussione Filadelfo Fiamma
Buongiorno a tutti,

Avrei un quesito circa l'utilizzo del modulo pickle.
L'obiettivo della mia applicazione è gestire un mini-database di file
pickle, una volta che sono stati acquisiti i dati da altre fonti.
Studiando il modulo ho individuato due metodi: dump() e load() che mi
consentono di salvare su file e di leggere da file gli oggetti in
questione. Molto spesso capita di dover salvare un oggetto una seconda
volta dopo che è stato aggiornato, e tale scopo rieffettuo il dump().
Mi chiedo se invece sia possibile aggiornare il file pickle, andando
dunque a modificare e/o aggiungere solo delle specifiche parti
piuttosto che effettuare il dump dell'intero oggetto?

Grazie mille

Buona giornata

FF
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Daniele Varrazzo
On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
philosga...@gmail.com wrote:

 Avrei un quesito circa l'utilizzo del modulo pickle.
 L'obiettivo della mia applicazione è gestire un mini-database di file
 pickle, una volta che sono stati acquisiti i dati da altre fonti.
 Studiando il modulo ho individuato due metodi: dump() e load() che mi
 consentono di salvare su file e di leggere da file gli oggetti in
 questione. Molto spesso capita di dover salvare un oggetto una seconda
 volta dopo che è stato aggiornato, e tale scopo rieffettuo il dump().
 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?

No. Pickle non è un database, è uno stream. Puoi mettere il risultato di
pickle in un database ma difficilmente puoi trattarlo in maniera diversa da
un blob opaco.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Daniele Varrazzo
On Tue, 10 May 2011 12:13:34 +0200, Filadelfo Fiamma
philosga...@gmail.com wrote:
 Il 10 maggio 2011 12:07, Daniele Varrazzo p...@develer.com ha scritto:
 On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
 philosga...@gmail.com wrote:

 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?

 No. Pickle non è un database, è uno stream. Puoi mettere il risultato
di
 pickle in un database ma difficilmente puoi trattarlo in maniera
diversa
 da
 un blob opaco.
 
 Capisco, tralasciando la difficoltà, la via da percorrere sarebbe la
 modifica dei metodi __getstate__ e __setstate__ ?

No, forse non le hai capite :)

Pickle si comporta come una sorta di framework: visita un grafo di oggetti
e per ognuno ne estrae lo stato. Puoi personalizzare come il tuo oggetto
viene salvato nel pickle implementando __get/setstate__, ma questo non
modifica la strategia di visita né la scrittura del file.

Pickle è uno stream, il che vuol dire che non chiede mai al file in cui
scrivere modifica i byte dal 100 al 103. Se lo facesse non potresti
scrivere un pickle su stdout o leggerlo da stdin. Questo rende pickle un
formato di serializzazione, non un database.


-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Filadelfo Fiamma
Il 10 maggio 2011 12:59, Daniele Varrazzo p...@develer.com ha scritto:
 On Tue, 10 May 2011 12:13:34 +0200, Filadelfo Fiamma
 philosga...@gmail.com wrote:
 Il 10 maggio 2011 12:07, Daniele Varrazzo p...@develer.com ha scritto:
 On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
 philosga...@gmail.com wrote:

 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?

 No. Pickle non è un database, è uno stream. Puoi mettere il risultato
 di
 pickle in un database ma difficilmente puoi trattarlo in maniera
 diversa
 da
 un blob opaco.

 Capisco, tralasciando la difficoltà, la via da percorrere sarebbe la
 modifica dei metodi __getstate__ e __setstate__ ?

 No, forse non le hai capite :)

 Pickle si comporta come una sorta di framework: visita un grafo di oggetti
 e per ognuno ne estrae lo stato. Puoi personalizzare come il tuo oggetto
 viene salvato nel pickle implementando __get/setstate__, ma questo non
 modifica la strategia di visita né la scrittura del file.

 Pickle è uno stream, il che vuol dire che non chiede mai al file in cui
 scrivere modifica i byte dal 100 al 103. Se lo facesse non potresti
 scrivere un pickle su stdout o leggerlo da stdin. Questo rende pickle un
 formato di serializzazione, non un database.


 --
 Daniele Varrazzo - Develer S.r.l.
 http://www.develer.com
 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python


Eh si non avevo ben capito :D. Ti ringrazio ancora.

Ciao buona giornata!

FF
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Manlio Perillo
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Il 10/05/2011 12:01, Filadelfo Fiamma ha scritto:
 Buongiorno a tutti,
 
 Avrei un quesito circa l'utilizzo del modulo pickle.
 L'obiettivo della mia applicazione è gestire un mini-database di file
 pickle, una volta che sono stati acquisiti i dati da altre fonti.
 Studiando il modulo ho individuato due metodi: dump() e load() che mi
 consentono di salvare su file e di leggere da file gli oggetti in
 questione. Molto spesso capita di dover salvare un oggetto una seconda
 volta dopo che è stato aggiornato, e tale scopo rieffettuo il dump().
 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?
 

E' possibile, ma non ha molto senso.
Prova ad esempio a fare:

import pickle

l = [1, 2, 3]
stream = file('/tmp/list.pickle', 'wb')

pickle.dump(l, stream)
stream.close()


Il file conterrà (utilizzando il protocollo non binario):
(lp0
I1
aI2
aI3
a.


Se modifichi il file, puoi modificare il contenuto della lista che verrà
poi caricato tramite load.
Ma, come detto, ha poco senso perchè il formato pickle non è pensato per
questo.



Ciao  Manlio
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk3JJg4ACgkQscQJ24LbaUSYNwCfcewtHjlR8f6DdkoIbw2g49V/
u18AniWLXlaHrqQl92F0Pw0ChJBotf73
=79PE
-END PGP SIGNATURE-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Riccardo Lemmi
Filadelfo Fiamma wrote:

 Buongiorno a tutti,
 
 Avrei un quesito circa l'utilizzo del modulo pickle.
 L'obiettivo della mia applicazione è gestire un mini-database di file
 pickle, una volta che sono stati acquisiti i dati da altre fonti.
 Studiando il modulo ho individuato due metodi: dump() e load() che mi
 consentono di salvare su file e di leggere da file gli oggetti in
 questione. Molto spesso capita di dover salvare un oggetto una seconda
 volta dopo che è stato aggiornato, e tale scopo rieffettuo il dump().
 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?
 
 Grazie mille
 
 Buona giornata
 
 FF

Ti consiglio di guardare lo ZODB. Fa sicuramente molte cose in più rispetto a
quello che ti serve ma puoi prendere spunto da lì per la gestione
dei 'salvataggi'.

Nello specifico lo ZODB usa pickle per la serializzazione, nel caso di un
oggetto composito esegue la serializzazione solo delle parti che sono cambiate;
le classi devono derivare dalla classe Persistent per fare in modo che lo ZODB
capisca cosa è cambiato e ogni oggetto cambiato viene serializzato
separatamente, ma lo ZODB gestisce anche i riferimenti tra gli oggetti in modo
che siano sempre validi... meglio se guardi il codice :)
-- 
   Riccardo Lemmi

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Filadelfo Fiamma
Grazie del consiglio :D. Effettuare il dump() delle parti da
aggiornare e modificare la load() in modo che tenga conto di più file
pkl, mi sembra la giusta via da seguire!

Il 10 maggio 2011 15:12, Riccardo Lemmi ricca...@reflab.com ha scritto:
 Filadelfo Fiamma wrote:

 Buongiorno a tutti,

 Avrei un quesito circa l'utilizzo del modulo pickle.
 L'obiettivo della mia applicazione è gestire un mini-database di file
 pickle, una volta che sono stati acquisiti i dati da altre fonti.
 Studiando il modulo ho individuato due metodi: dump() e load() che mi
 consentono di salvare su file e di leggere da file gli oggetti in
 questione. Molto spesso capita di dover salvare un oggetto una seconda
 volta dopo che è stato aggiornato, e tale scopo rieffettuo il dump().
 Mi chiedo se invece sia possibile aggiornare il file pickle, andando
 dunque a modificare e/o aggiungere solo delle specifiche parti
 piuttosto che effettuare il dump dell'intero oggetto?

 Grazie mille

 Buona giornata

 FF

 Ti consiglio di guardare lo ZODB. Fa sicuramente molte cose in più rispetto a
 quello che ti serve ma puoi prendere spunto da lì per la gestione
 dei 'salvataggi'.

 Nello specifico lo ZODB usa pickle per la serializzazione, nel caso di un
 oggetto composito esegue la serializzazione solo delle parti che sono 
 cambiate;
 le classi devono derivare dalla classe Persistent per fare in modo che lo ZODB
 capisca cosa è cambiato e ogni oggetto cambiato viene serializzato
 separatamente, ma lo ZODB gestisce anche i riferimenti tra gli oggetti in modo
 che siano sempre validi... meglio se guardi il codice :)
 --
                                       Riccardo Lemmi

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python




-- 
Filadelfo Fiamma
mail: philosga...@gmail.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Aggiornare file pickle

2011-05-10 Per discussione Filadelfo Fiamma
Ringrazio tutti quanti :)
Mi permetto di descrivere brevemente ciò che ho sperimentato, seppur
esso non sia generica come applicazione, ma riesce a gestire oggetti
fatti in questo modo: {key:[]}, nel mio caso è un log per gli accessi
effettuati su di un certo file, ordinati cronologicamente.

La classica dump() va a ricreare il mio log.pkl ogni qualvolta si
effettua un accesso.
La dump() modificata invece crea un file log_X.pkl, con X
incrementale, che contiene solo l'accesso appena effettuato.

La load() modificata dunque tiene di tutti i file log_X e li raggruppa
per ottenere l'intero oggetto, in più si occupa anche di eliminare
tutti i file log_X e di riunire tutta l'informazione in un unico file
pkl, considerando che quest'azione avviene solo in fase di
inizializzazione, ho ritenuto che fosse tollerabile rallentare questa
fase per poter essere veloci nelle dump(), magari sarebbe opportuno
effettuare questo raggruppamento ogni qualvolta si raggiunga un certo
numero di file log_X.

Ho effettuato il profiling inserendo 2000 volte la chiave 'pippo',
avente come valore un indice incrementale.
La dump() classica il computer ha impiegato 27.321 secondi
La dump() modificata invece ha impiegato 4.114 secondi

Buona serata a tutti
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python