Estoy tratando de aplicar _pickle para guardar datos en el disco. Pero cuando se llama a _pickle.dump, tengo un error

OverflowError: cannot serialize a bytes object larger than 4 GiB

Es este un duro limitación para el uso de _pickle? (cPickle para python2)

InformationsquelleAutor Jake0x32 | 2015-04-17

3 Comentarios

  1. 63

    Ya no en Python 3.4 que tiene PEP 3154 y Pepinillos 4.0

    https://www.python.org/dev/peps/pep-3154/

    Pero hay que decir que desea utilizar la versión 4 del protocolo:

    https://docs.python.org/3/library/pickle.html

    pickle.dump(d, open("file", 'w'), protocol=4)
    • es una buena manera de abrir el archivo de esta manera? Quiero decir, sin cerrarla.
    • Sería una buena práctica para abrir el archivo con un » con » instrucción para asegurarse de que el archivo se cierra. Sin embargo, el recuento de referencia para el archivo objeto cae a cero tan pronto como la llamada a la vinagreta.volcado de devoluciones, por lo que obtendrá la recolección de inmediato, y el archivo será cerrada.
  2. 4

    Sí, este es un límite codificado; de save_bytes función:

    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 a escribir el tamaño del objeto en el disco, lo que significa que solo puede seguir tamaños de hasta 232 == 4GB.

    Si usted puede romper el bytes objeto en varios objetos, cada uno de los menores de 4 gb, usted todavía puede guardar los datos en un apuro, por supuesto.

    • Gracias! es posible guardar un archivo de gran tamaño en el disco y eludir este límite?
    • no con salmuera; este es un límite duro en el protocolo. Romper su bytes objeto en trozos más pequeños.
    • Gotcha! Gracias!
    • Tengo el mismo problema al intentar pickle un clasificador from sklearn.svm import SVC. ¿Cómo puedo romper el objeto en bytes y, a continuación, pepinillo?
  3. 1

    Hay una gran respuestas sobre el por qué de la salmuera no funciona.
    Pero aún así no funciona para Python 2.7, que es un problema
    si usted está todavía en Python 2.7 y desea apoyar a los grandes
    archivos, especialmente NumPy (NumPy matrices de más de 4G fallar).

    Puede utilizar OC serialización, el cual ha sido actualizado para trabajar de datos a través de
    4Gig. Hay un Python C módulo de Extensión disponible en:

    http://www.picklingtools.com/Downloads

    Echar 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, he aquí un rápido resumen: hay ocdumps y ocloads, muy parecida a la de
    pickle volcados y cargas::

    from pyocser import ocdumps, ocloads
    ser = ocdumps(pyobject)   : Serialize pyobject into string ser
    pyobject = ocloads(ser)   : Deserialize from string ser into pyobject

    El OC de la Serialización es de 1,5-2 veces más rápido, y también trabaja con C++ (si la mezcla de idiomas). Funciona con todos los tipos integrados, pero no las clases
    (en parte porque es el lenguaje de la cruz y es difícil construir clases de C++
    desde Python).

Dejar respuesta

Please enter your comment!
Please enter your name here