2015-05-21 12 views
6

Próbuję serializować duży obiekt Pythona, złożony z krotki numpy tablic przy użyciu pickle/cPickle i gzip. Procedura działa dobrze aż do pewnego rozmiaru danych, a potem pojawia się następujący błąd:Python gzip: Rozmiar OverflowError nie mieści się w int

--> 121  cPickle.dump(dataset_pickle, f) 

    ***/gzip.pyc in write(self, data) 
    238    print(type(self.crc)) 
    239    print(self.crc) 
--> 240    self.crc = zlib.crc32(data, self.crc) & 0xffffffffL 
    241    self.fileobj.write(self.compress.compress(data)) 

OverflowError: size does not fit in an int 

Wielkość numpy tablicy jest około 1,5 GB i łańcuch wysłany do zlib.crc32 przekroczy 2 GB . Pracuję na maszynie 64-bitowej i mój Python jest również 64-bitowy

>>> import sys 
>>> sys.maxsize 
9223372036854775807 

Czy jest to błąd z python lub czy robię coś nie tak? Czy istnieją dobre alternatywy do kompresowania i serializowania numpy tablic? Ja przyjrzeniu numpy.savez, PyTables i hdf5 teraz, ale dobrze byłoby wiedzieć, dlaczego mam ten problem, ponieważ mam mało pamięci


Aktualizacja: Pamiętam, że czytałem gdzieś, że może to być spowodowane używając starej wersji Numpy (i byłem), ale w pełni zmieniłem na numpy.save/savez zamiast tego, który jest rzeczywiście szybszy niż cPickle (przynajmniej w moim przypadku)

Odpowiedz

1

To wydaje się być błędem python 2.7

https://bugs.python.org/issue23306

Po sprawdzeniu raportu o błędzie nie wygląda na to, że czeka na to rozwiązanie. Najlepszym wyjściem byłoby przejście do Pythona 3, który najwyraźniej nie wykazywał tego błędu.

+0

Wygląda na to, że problem został zamknięty. –