_pickle in python3 no funciona para guardar grandes datos

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)

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) 

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.

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 todavía 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:

http://www.picklingtools.com/html/faq.html#python-c-extension-modules-new-as-of-picklingtools-1-6-0-and-1-3-3

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).