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


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  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 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 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 Filadelfo Fiamma
Il 10 maggio 2011 12:59, Daniele Varrazzo  ha scritto:
> On Tue, 10 May 2011 12:13:34 +0200, Filadelfo Fiamma
>  wrote:
>> Il 10 maggio 2011 12:07, Daniele Varrazzo  ha scritto:
>>> On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
>>>  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 Daniele Varrazzo
On Tue, 10 May 2011 12:13:34 +0200, Filadelfo Fiamma
 wrote:
> Il 10 maggio 2011 12:07, Daniele Varrazzo  ha scritto:
>> On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
>>  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:07, Daniele Varrazzo  ha scritto:
> On Tue, 10 May 2011 12:01:42 +0200, Filadelfo Fiamma
>  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
>

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

Grazie ancora

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
 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


[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