python - serialize - Alternativas de salmuera
python serialize object to json (7)
Estoy tratando de serializar una lista grande (~ 10 ** 6 filas, cada una con ~ 20 valores), para usarla más tarde (así que la falta de seguridad de Pickle no es una preocupación).
Cada fila de la lista es una tupla de valores, derivada de alguna base de datos SQL. Hasta ahora, he visto datetime.datetime, cadenas, enteros y NoneType, pero quizás tenga que admitir tipos de datos adicionales.
Para la serialización, he considerado pickle (cPickle), json y texto simple, pero solo pickle guarda la información de tipo: json no puede serializar datetime.datetime, y el texto simple tiene sus obvias desventajas.
Sin embargo, cPickle es bastante lento para datos tan grandes, y estoy buscando una alternativa más rápida.
¿Alguna sugerencia?
¡Gracias!
Los buffers de protocolo son un mecanismo flexible, eficiente y automatizado para serializar datos estructurados, piense en XML, pero más pequeños, más rápidos y más simples.
ventajas sobre XML:
- son mas simples
- son 3 a 10 veces más pequeños
- Son 20 a 100 veces más rápido
- son menos ambiguos
- Genera clases de acceso a datos que son más fáciles de usar programáticamente
https://developers.google.com/protocol-buffers/docs/pythontutorial
Creo que deberías PyTables un vistazo a PyTables . Debería ser ridículamente rápido, al menos más rápido que usar un RDBMS, ya que es muy relajado y no impone ninguna restricción de lectura / escritura, además de que obtiene una mejor interfaz para administrar sus datos, al menos en comparación con su selección.
Para cientos de miles de objetos de Python de complejidad simple (hasta compatible con JSON), he encontrado la mejor combinación de simplicidad, velocidad y tamaño al combinar:
cPickle
opciones de pickle
y cPickle
por órdenes de magnitud.
with gzip.open(filename, ''wb'') as f:
ubjson.dump(items, f)
with gzip.open(filename, ''rb'') as f:
return ubjson.load(f)
Por lo general, serializo a texto plano (* .csv) porque lo encontré más rápido. El módulo csv funciona bastante bien. Consulte http://docs.python.org/library/csv.html
Si tiene que lidiar con Unicode para sus cadenas, vea los ejemplos de UnicodeReader y UnicodeWriter al final.
Si serializa para su propio uso futuro, supongo que sería suficiente saber que tiene el mismo tipo de datos por columna csv (por ejemplo, la cadena siempre está en la columna 2).
Avro parece ser una solución prometedora y bien diseñada pero aún no popular.
Pickle es en realidad bastante rápido, siempre y cuando no esté utilizando el protocolo ASCII (predeterminado). Solo asegúrate de volcar utilizando protocol=pickle.HIGHEST_PROTOCOL
.
- https://developers.google.com/protocol-buffers/docs/pythontutorial - por ejemplo, utilizado en Caffe ; mantiene la información de tipo, pero hay que poner mucho esfuerzo en ella en comparación con pickle
- MessagePack : ver paquete de python - soporta streaming ( source )
- BSON : ver documentos del paquete python