2012-10-03 18 views
6

Actualmente estoy trabajando en un proyecto en Java donde debo realizar varias tareas de Recuperación de información y Clasificación en un conjunto de datos muy grande. Una pequeña colección tendría documentos 10K. De cada documento, alrededor de 100 vectores de dobles de 150 dimensiones. Entonces, alrededor de 1 millón de vectores de 150 dobles o 150 millones de dobles. Después de almacenarlo, necesito recordarlos a todos O a un porcentaje de ellos y realizar agrupamientos (por ejemplo, KMEANS). Las colecciones reales tienen muchos más documentos (actualmente estoy tratando con documentos 200K).La mejor manera de almacenar y recuperar grandes conjuntos de datos con Java

Por supuesto que he tratado varias veces con OutOfMemoryError y mi última solución al problema fue almacenar en 10 enormes archivos XML con un tamaño total> 5GB. Los archivos tenían que ser 10 porque DOM Writer obtuvo la memoria completa. Para la lectura utilicé SAX Parser, que hizo el trabajo sin cargarlos en la memoria. Además, almacenar un doble en cualquier tipo de texto multiplica su tamaño real y agrega el costo computacional de análisis y conversión. Finalmente, los algoritmos de agrupación generalmente son iterativos, por lo que necesitarán los mismos datos una y otra vez. Mi método no guardaba nada en la memoria caché, solo leía desde el disco muchas veces.

Ahora estoy buscando una forma más compacta de almacenar cualquier cantidad de datos en formato binario (base de datos, archivo binario sin procesar, etc.) y una forma eficiente de leerlos. ¿Alguien tiene alguna idea para proponer?

Respuesta

4

Base de datos integrada o almacenamiento de clave-valor. Hay muchos de ellos, p. JDBM3. ¿Y qué idea más extraña almacenar en formato xml? Simplemente podría volcar una matriz en un archivo utilizando la técnica de serialización estándar.

+1

JDBM3 se ha actualizado a JDBM4, mejor conocido como [MapDB] (http://www.mapdb.org/). –

0

No utilice Derby para este fin. El almacenamiento de más de 500k entradas es muy lento y usa demasiada memoria

1

No estoy tan seguro de su caso, pero para nuestras necesidades de "manejo de datos grandes" utilizamos noSQL DB y funcionó bastante bien.

+0

Extenderé esta respuesta con el enfoque de Big Data en general. Mira a hadoop para procesar archivos muy grandes y bases de datos NoSQL (por @ jakub.petr) para mantener esa información –

0

In-Memory Datagrids puede resolver su problema. Hay varias soluciones de código abierto disponibles (Hazelcast, Infinispan).

Solo he trabajado con hazelcast todavía, así que no puedo contarle nada sobre los demás.

Hazelcast propaga los datos en varios nodos. Las consultas también se distribuyen en todos los nodos del clúster.

Cuestiones relacionadas