Pregunta

Necesito serializar una gran cantidad de datos (alrededor de 2 segmentos) de objetos pequeños en un solo archivo para ser procesados ??posteriormente por otro proceso Java. El rendimiento es algo importante. ¿Alguien puede sugerir un buen método para lograr esto?

¿Fue útil?

Solución

¿Ha echado un vistazo a los búferes de protocolo de google ? Suena como un caso de uso para ello.

Otros consejos

No sé por qué se rechazó la serialización de Java, es un mecanismo perfectamente viable.

No está claro en la publicación original, pero ¿todos los 2G de datos están en el montón al mismo tiempo? ¿O estás tirando algo más?

Fuera de la caja, la serialización no es la " perfecta " solución, pero si implementa Externalizable en sus objetos, la serialización puede funcionar bien. El gran gasto de las serializaciones es averiguar qué escribir y cómo escribirlo. Al implementar Externalizable, tomas esas decisiones de las manos, obteniendo un gran impulso en el rendimiento y un ahorro de espacio.

Si bien la E / S es un costo primario 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 regresar, es mejor almacenarlos en un formato más nativo si es posible. 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 única estructura, simplemente puede hacer ObjectOutputStream.writeObject (yourBigDatastructure), después de haber implementado Externalizable.

Sin embargo, también puede iterar sobre su estructura y llamar a writeObject en los objetos individuales.

De cualquier manera, vas a necesitar algo de " objectToFile " rutina, tal vez varios. Y eso es efectivamente lo que proporciona Externalizable, así como un marco para recorrer 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.

Un enfoque más simple que se me viene a la mente es usar el búfer de NIO (java.nio.MappedByteBuffer) asignado en memoria. Use el búfer único (aproximadamente) correspondiente al tamaño de un objeto y vacíelo / adjúntelo al archivo de salida cuando sea necesario. Los búferes asignados a la memoria son muy eficientes.

¿Has probado la serialización de Java? Los escribiría utilizando un ObjectOutputStream y léalos nuevamente usando un ObjectInputStream . Por supuesto, las clases deberían ser Serializable . Sería la solución de bajo esfuerzo y, como los objetos se almacenan en binario, sería compacto y rápido.

Si el rendimiento es muy importante, necesita escribirlo por sí mismo. Debe utilizar un formato binario compacto. Porque con 2 GB la operación de E / S del disco es muy importante. Si utiliza cualquier formato legible por humanos, como XML u otros scripts, redimensiona los datos con un factor de 2 o más.

Según los datos, se puede acelerar si comprime los datos sobre la marcha con una tasa de compresión baja.

Un total no ir es la serialización de Java porque al leer Java verifique cada objeto si es una referencia a un objeto existente.

Desarrollé JOAFIP como base de datos alternativa.

Apache Avro también puede ser útil. Está diseñado para ser independiente del idioma y tiene enlaces para los idiomas populares .

Compruébalo.

búferes de protocolo: tiene sentido. Aquí hay un extracto de su wiki: http://code.google.com/apis /protocolbuffers/docs/javatutorial.html

Obteniendo más velocidad

De forma predeterminada, el compilador del búfer de protocolo intenta generar archivos más pequeños utilizando 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ódigo optimizado explícitamente para sus tipos de mensajes, a menudo proporcionando un aumento de rendimiento de un orden de magnitud, pero también duplicando el tamaño del código. Si la creación de perfiles muestra que su aplicación pasa 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 protocolos, y generará un análisis, una serialización y otro código extremadamente rápidos.

Probablemente debería considerar una solución de base de datos; todas las bases de datos lo hacen para optimizar su información, y si usa Hibernate, mantiene su modelo de objetos tal como está y ni siquiera piensa en su base de datos (creo que por eso se llama hibernar, simplemente almacene sus datos, luego recupérelos)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top