I don't know expat at all, but I'd guess that it's having to hold too much state in memory for some reason. Is the XML mal formed in some way? Do you have handlers registered for end tags of large blocks?
I'm thinking that if you have a handler registered for the end of a large block, and expat is expected to pass the block to the handler, then expat could be running out of memory before it's able to completely gather that block. As I said, I don't know expat, so this might not be possible, I'm just asking.
Alternately, are you sure that expat is where the memory loss is? I could imagine a situation where you were keeping some information about the contents of the XML file, and your own data structures, either because the data was so large, or because of memory leaks in your code, caused the out of memory condition.