Saturday, April 02, 2005

marshal vs. cPickle in python

obisnuiam sa "serializez" datele cu marshal, mai rapid decat pickle si cPickle (varianta scrisa in C a lui pickle).
acum cateva zile aveam placerea de scrie un program ce imi genera un dictionar de liste (de forma dictionar["Gigel"] = [lista cu mai mult de 100 de elemente], cu len(dictionar) ~ 5), ce dupa aceea era salvat ("dump"-uit) intr-un fisier binar. La un "load" succesiv, pentru len(dictionar["Gigel"]) ~ 100), nici o problema. mai adaug niste elemente lui dictionar["Gigel"] (ca si lui dictionar["Vasile"] sau dictionar["Alina"]), astfel incat len(dictionar["Gigel"]) ~ 200, "dump" din nou, nici o problema. Insa cand incerc din nou un "load", imi afiseaza eroare de serializare.
Am pierdut o seara intreaga inainte de a-mi da seama ca ar fi bine sa incerc sa fac "dump" din prima pentru un dictionar cu len(dictionar[item]) ~ 200. O fac, nici o eroare la "dump", insa imediat eroare la "load".
Redeschid manualul, citesc asta


The following types are supported: None, integers, long integers, floating point numbers, strings, Unicode objects, tuples, lists, dictionaries, and code objects, where it should be understood that tuples, lists and dictionaries are only supported as long as the values contained therein are themselves supported; and recursive lists and dictionaries should not be written (they will cause infinite loops).


si desi nu am liste sau dictionare recursive ma gandesc ca ar fi bine sa-i dau o sansa si lui cPickle. peste tot unde apare "marshal" inlocuiesc cu "cPickle", run...
nici o eroare, totul merge bine. Inca nu am stat sa caut pe google daca si altii s-au confruntat cu ceva de genul asta, dar morala este ca ar fi trebuit sa imi intre in cap "warning-urile" din manual:

The marshal module exists mainly to support reading and writing the ``pseudo-compiled'' code for Python modules of .pyc files. Therefore, the Python maintainers reserve the right to modify the marshal format in backward incompatible ways should the need arise.

1 Comments:

Anonymous Anonymous said...

This comment has been removed by a blog administrator.

6:18 PM  

Post a Comment

<< Home