2015-04-17 5 views

risposta

1

Sì, questo è un limite hardcoded; da save_bytes function:

else if (size <= 0xffffffffL) { 
    // ... 
} 
else { 
    PyErr_SetString(PyExc_OverflowError, 
        "cannot serialize a bytes object larger than 4 GiB"); 
    return -1;   /* string too large */ 
} 

Il protocollo utilizza 4 byte di scrivere la dimensione dell'oggetto a disco, che significa che è possibile seguire soltanto dimensioni fino a 2 == 4GB.

Se è possibile suddividere l'oggetto bytes in più oggetti, ciascuno di dimensioni inferiori a 4 GB, è comunque possibile salvare i dati su un sottaceto, naturalmente.

+0

Grazie! è possibile salvare file di grandi dimensioni su disco e aggirare questo limite? – Jake0x32

+0

@ Jake0x32: non con pickle; questo è un limite difficile nel protocollo. Spezza l'oggetto 'bytes' in pezzi più piccoli. –

+0

Gotcha! Grazie! – Jake0x32

1

C'è grandi risposte sopra per il motivo per cui pickle non funziona. Ma ancora non funziona con Python 2.7, che è un problema se si è ancora in Python 2.7 e si vuole supportare grandi file , in particolare NumPy (gli array NumPy oltre 4G falliscono).

È possibile utilizzare la serializzazione OC, che è stata aggiornata per funzionare per i dati su 4Gig. C'è a disposizione un modulo Python C Extension da:

http://www.picklingtools.com/Downloads

Date un'occhiata alla documentazione:

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

Ma, ecco un breve riassunto: c'è ocdumps e ocloads, molto simile discariche e carichi ::

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

The OC Se del sottaceto la rializzazione è 1.5-2 volte più veloce e funziona anche con C++ (se stai mixando le lingue). Funziona con tutti i tipi built-in, ma non con le classi (in parte perché è cross-language ed è difficile creare classi C++ da Python).