saving - _pickle in python3 no funciona para guardar grandes datos
python pickle dump and load (3)
Hay una gran respuesta por encima de por qué pickle no funciona. Pero aún no funciona para Python 2.7, que es un problema si aún estás en Python 2.7 y quieres admitir archivos grandes, especialmente NumPy (las matrices NumPy sobre 4G fallan).
Puede usar la serialización OC, que se ha actualizado para que funcione con datos de 4Gig. Hay un módulo de extensión Python C disponible en:
http://www.picklingtools.com/Downloads
Echa un vistazo a la Documentación:
Pero, aquí hay un breve resumen: hay ocdumps y ocloads, muy parecidos a las descargas y cargas de pickle:
from pyocser import ocdumps, ocloads
ser = ocdumps(pyobject) : Serialize pyobject into string ser
pyobject = ocloads(ser) : Deserialize from string ser into pyobject
La OC Serialization es 1.5-2x más rápida y también funciona con C ++ (si está mezclando idiomas). Funciona con todos los tipos incorporados, pero no con clases (en parte porque es un lenguaje cruzado y es difícil crear clases de C ++ desde Python).
Estoy tratando de aplicar _pickle
para guardar datos en el disco. Pero cuando llamo _pickle.dump
, recibí un error
OverflowError: cannot serialize a bytes object larger than 4 GiB
¿Es esta una limitación difícil de usar _pickle
? ( cPickle
para python2)
Sí, este es un límite codificado; desde la función save_bytes
:
else if (size <= 0xffffffffL) {
// ...
}
else {
PyErr_SetString(PyExc_OverflowError,
"cannot serialize a bytes object larger than 4 GiB");
return -1; /* string too large */
}
El protocolo utiliza 4 bytes para escribir el tamaño del objeto en el disco, lo que significa que solo puede rastrear tamaños de hasta 2 32 == 4GB.
Si puede dividir el objeto de bytes
en varios objetos, cada uno de menos de 4 GB, todavía puede guardar los datos en un pickle, por supuesto.
Ya no está en Python 3.4, que tiene PEP 3154 y Pickle 4.0
https://www.python.org/dev/peps/pep-3154/
Pero debes decir que quieres usar la versión 4 del protocolo:
https://docs.python.org/3/library/pickle.html
pickle.dump(d, open("file", ''w''), protocol=4)