Problem with cPickle and cElementTree
Stefan Behnel
stefan_ml at behnel.de
Fri Oct 10 01:27:35 EDT 2008
Barry wrote:
> I recently tried switching from ElementTree to cElementTree. My
> application parses a collection of large XML files and creates indexes
> based on certain attributes. This entire collection is saved as an
> instance of my Database class. Using ElementTree and cPickle has
> allowed me to save these instances and use them later.
>
> Using cElementTree significantly reduces parse time (~50%) and memory
> ~(15%) but cPickle refuses to pickle the database object. I receive:
>
> TypeError: expecting string or Unicode object, NoneType found
>
> The offending line of code simple shows my invocation of cPickle,
> which is not helpful.
>
> Doing exactly the same thing with ElementTree works fine.
>
> It appears that the objects returned by cElementTree do not pickle
> correctly. Is this a know issue? I was unable to find any reports of
> this problem.
Pickling is (almost always) built-in for pure Python classes, but it needs to
be implemented explicitly for C classes. cElementTree simply doesn't support this.
If you need a fast and memory friendly XML engine *and* want to pickle
elements, take a look at lxml.objectify. Note that it's only partially
compatible with ElementTree, so you will have to change your code (lxml.etree
is mostly compatible, but it doesn't support pickling). It's a very
easy-to-use XML library, though.
Stefan
More information about the Python-list
mailing list