Re: [Python] Aggiornare file pickle
Il 16 maggio 2011 16:50, Luca Bacchi ha scritto: > Allora funziona come Word! > > ;-) > Per fortuna no :D ! Il problema sono i riferimenti degli oggetti, ecco perchè con i dati semplici non dava questo problema... solved :) .. scusate l'intasamento inutile della lista. Ciao! FF >> Ciao ragazzi, >> Vi ricontatto in merito alla discussione che ho aperto il 10 maggio. >> Ricapitolando in breve, mi sono interessato nella gestione >> incrementale dei file pickle, facendo in modo che il salvataggio >> dell'intero oggetto non avvenga ad ogni dump(), ma che vada ad >> interessare solo la parte da aggiungere. In questo modo vengono >> creati N file pickle che sono raggruppati alla fine del processo, >> oppure su richiesta, in un unico file pickle. >> Ho effettuato svariate prove, verificando il funzionamento del >> processo, in particolar modo la correttezza delle informazioni: in >> effetti cosi è. >> L'unica anomalia che ho riscontrato è la dimensione del pickle: il >> pickle creato dal raggruppamento di tutti i pickle di aggiornamento, >> ha una dimensione maggiore rispetto a quanto aspettato (Il paragone è >> stato fatto con la dimensione di un file pickle generato senza >> gestione incrementale, in modo classico). >> Premetto che non mi sono minimamente fidato di ricostruire "a mano" >> l'oggetto, con il copia incolla dei pkl a livello testuale, bensì ho >> ricostruito in memoria l'oggetto, che è un dizionario, ed ho >> effettuato il dump finale. >> Analizzando il contenuto testuale del pickle, ho notato l'aggiunta di >> diverse righe (g5,g6,g7 ecc) ripetute per ogni chiave del dizionario. >> Ho inoltre notato che, utilizzando tipi di dato semplice, non è >> presente questa differenza nella dimensione. >> Da cosa può dipendere questa anomalia, se di anomalia si tratta? >> >> Grazie mille >> Buon pomeriggio a tutti >> >> FF >> >> >Il 10 maggio 2011 17:17, Filadelfo Fiamma ha >> >scritto: >> > 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 > ___ > 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
Allora funziona come Word! ;-) Il giorno 16 maggio 2011 16:28, Filadelfo Fiamma ha scritto: > > Ciao ragazzi, > Vi ricontatto in merito alla discussione che ho aperto il 10 maggio. > Ricapitolando in breve, mi sono interessato nella gestione > incrementale dei file pickle, facendo in modo che il salvataggio > dell'intero oggetto non avvenga ad ogni dump(), ma che vada ad > interessare solo la parte da aggiungere. In questo modo vengono > creati N file pickle che sono raggruppati alla fine del processo, > oppure su richiesta, in un unico file pickle. > Ho effettuato svariate prove, verificando il funzionamento del > processo, in particolar modo la correttezza delle informazioni: in > effetti cosi è. > L'unica anomalia che ho riscontrato è la dimensione del pickle: il > pickle creato dal raggruppamento di tutti i pickle di aggiornamento, > ha una dimensione maggiore rispetto a quanto aspettato (Il paragone è > stato fatto con la dimensione di un file pickle generato senza > gestione incrementale, in modo classico). > Premetto che non mi sono minimamente fidato di ricostruire "a mano" > l'oggetto, con il copia incolla dei pkl a livello testuale, bensì ho > ricostruito in memoria l'oggetto, che è un dizionario, ed ho > effettuato il dump finale. > Analizzando il contenuto testuale del pickle, ho notato l'aggiunta di > diverse righe (g5,g6,g7 ecc) ripetute per ogni chiave del dizionario. > Ho inoltre notato che, utilizzando tipi di dato semplice, non è > presente questa differenza nella dimensione. > Da cosa può dipendere questa anomalia, se di anomalia si tratta? > > Grazie mille > Buon pomeriggio a tutti > > FF > > >Il 10 maggio 2011 17:17, Filadelfo Fiamma ha scritto: > > 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 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Aggiornare file pickle
Ciao ragazzi, Vi ricontatto in merito alla discussione che ho aperto il 10 maggio. Ricapitolando in breve, mi sono interessato nella gestione incrementale dei file pickle, facendo in modo che il salvataggio dell'intero oggetto non avvenga ad ogni dump(), ma che vada ad interessare solo la parte da aggiungere. In questo modo vengono creati N file pickle che sono raggruppati alla fine del processo, oppure su richiesta, in un unico file pickle. Ho effettuato svariate prove, verificando il funzionamento del processo, in particolar modo la correttezza delle informazioni: in effetti cosi è. L'unica anomalia che ho riscontrato è la dimensione del pickle: il pickle creato dal raggruppamento di tutti i pickle di aggiornamento, ha una dimensione maggiore rispetto a quanto aspettato (Il paragone è stato fatto con la dimensione di un file pickle generato senza gestione incrementale, in modo classico). Premetto che non mi sono minimamente fidato di ricostruire "a mano" l'oggetto, con il copia incolla dei pkl a livello testuale, bensì ho ricostruito in memoria l'oggetto, che è un dizionario, ed ho effettuato il dump finale. Analizzando il contenuto testuale del pickle, ho notato l'aggiunta di diverse righe (g5,g6,g7 ecc) ripetute per ogni chiave del dizionario. Ho inoltre notato che, utilizzando tipi di dato semplice, non è presente questa differenza nella dimensione. Da cosa può dipendere questa anomalia, se di anomalia si tratta? Grazie mille Buon pomeriggio a tutti FF >Il 10 maggio 2011 17:17, Filadelfo Fiamma ha scritto: > 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
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
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
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
-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
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
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
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
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
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