[Python] Aggiornare file pickle
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
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
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
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
-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
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
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
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