valor - Java: serializar una gran cantidad de datos en un solo archivo
serializacion y deserializacion en java (9)
¿Has echado un vistazo a los buffers de protocolo de google? Suena como un caso de uso para eso.
Necesito serializar una gran cantidad de datos (alrededor de 2gigs) de objetos pequeños en un solo archivo para ser procesados más tarde por otro proceso de Java. El rendimiento es algo importante. ¿Alguien puede sugerir un buen método para lograr esto?
El enfoque más simple que viene inmediatamente a mi mente es el uso del buffer mapeado en memoria de NIO (java.nio.MappedByteBuffer). Utilice el buffer único (aproximadamente) correspondiente al tamaño de un objeto y alinéelos / añádalos al archivo de salida cuando sea necesario. Los búferes mapeados en memoria son muy eficientes.
No sé por qué la Serialización Java fue rechazada, es un mecanismo perfectamente viable.
No está claro desde la publicación original, pero ¿todos los 2G de datos están en el montón al mismo tiempo? ¿O estás arrojando algo más?
Fuera de la caja, la serialización no es la solución "perfecta", pero si implementa Externalizable en sus objetos, la serialización puede funcionar bien. Serializaciones grandes gastos es averiguar qué escribir y cómo escribirlo. Al implementar Externalizable, usted toma esas decisiones de sus manos, obteniendo así un gran impulso en el rendimiento y un ahorro de espacio.
Si bien la E / S es un costo principal de escribir grandes cantidades de datos, los costos incidentales de convertir los datos también pueden ser muy costosos. Por ejemplo, no desea convertir todos sus números a texto y luego viceversa, mejor si es posible almacenarlos en un formato más nativo. ObjectStream tiene métodos para leer / escribir los tipos nativos en Java.
Si todos sus datos están diseñados para ser cargados en una sola estructura, simplemente podría hacer ObjectOutputStream.writeObject (yourBigDatastructure), después de haber implementado Externalizable.
Sin embargo, también podría iterar sobre su estructura y llamar a writeObject en los objetos individuales.
De cualquier manera, vas a necesitar alguna rutina "objectToFile", tal vez varias. Y eso es efectivamente lo que Externalizable proporciona, así como también un marco para hacer avanzar su estructura.
El otro problema, por supuesto, es el control de versiones, etc. Pero como usted mismo implementa todas las rutinas de serialización, también tiene control total sobre eso.
Probablemente deberías considerar una solución de base de datos: todas las bases de datos lo hacen para optimizar su información, y si usas Hibernate, mantienes tu modelo de objetos tal como está y ni siquiera piensas en tu DB (creo que es por eso que se llama hibernación, solo almacene sus datos, luego tráigalos de vuelta)
Si el rendimiento es muy importante, entonces necesitas escribirlo. Debe usar un formato binario compacto. Porque con 2 GB, la operación de E / S de disco es muy importante. Si usa cualquier formato legible por humanos como XML u otros scripts, cambie el tamaño de los datos con un factor de 2 o más.
Dependiendo de los datos, puede acelerarse si comprime los datos sobre la marcha con una tasa de compresión baja.
Un total no go es la serialización de Java porque al leer Java se comprueba en cada objeto si se trata de una referencia a un objeto existente.
¿Has probado la serialización java? Usted los escribiría utilizando un ObjectOutputStream y los leería nuevamente usando un ObjectInputStream . Por supuesto, las clases tendrían que ser Serializable
. Sería la solución de bajo esfuerzo y, como los objetos se almacenan en binario, sería compacto y rápido.
Desarrollé JOAFIP como alternativa de base de datos.
Apache Avro también podría ser útil. Está diseñado para ser independiente del idioma y tiene enlaces para los idiomas populares .
Echale un vistazo.
Buffers de protocolo: tiene sentido. aquí hay un extracto de su wiki: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html
Obtener más velocidad
De forma predeterminada, el compilador de búfer de protocolo intenta generar archivos más pequeños mediante el uso de la reflexión para implementar la mayoría de las funciones (por ejemplo, análisis y serialización). Sin embargo, el compilador también puede generar códigos optimizados de forma explícita para sus tipos de mensajes, a menudo proporcionando un aumento en el rendimiento del orden de magnitud, pero también duplicando el tamaño del código. Si el perfil muestra que su aplicación está pasando mucho tiempo en la biblioteca de búfer de protocolo, debe intentar cambiar el modo de optimización. Simplemente agregue la siguiente línea a su archivo .proto:
opción optimize_for = SPEED;
Vuelva a ejecutar el compilador de protocolo y generará un análisis extremadamente rápido, serialización y otro código.