2010-03-10 12 views
10

Me estoy quedando sin memoria en Java debido a algunas listas y conjuntos muy grandes creados en el transcurso de una transacción y repetidos una sola vez al final de la transacción. ¿Hay alguna biblioteca que proporcione colecciones de Java que puedan poner en cola sus contenidos serializables en el disco cuando el tamaño de la colección excede un umbral determinado?Colecciones de Java que se almacenan en el disco

+0

No es exactamente lo que podría estar buscando, eche un vistazo a Hadoop http://hadoop.apache.org/ – saugata

+1

¿Existe algún motivo por el que no esté utilizando un RDBMS estándar para esto? De una manera, es la definición de lo que estás preguntando. Incluso las más livianas, como h2db, sqlite, estarían a la altura de la mayoría de las tareas. – dpb

Respuesta

4

Usted podría intentar algo así como ehcache y su opción overflowToDisk

+0

como sé Ehcache no tiene lógica que sondear (obtener + eliminar) elementos de la caché, de acuerdo con la documentación veo solo los métodos #get(). Quizás sepa cómo puedo implementar tal funcionalidad usando ehcache? – MeetJoeBlack

4

No voy a publicar código de ejemplo, ya que sería demasiado largo, pero así es como lo he hecho antes:

  1. Extend LinkedBlockingQueue.
  2. Anula sus métodos offer, put, poll, take y remove. Ejemplo: si la superclase 'offer devuelve falso (capacidad alcanzada), luego Empezaría a serializar en el disco.
  3. Asimismo, en la implementación take, comprueba si tiene algún elemento presente en la memoria y, si no, y luego comienza a leer del disco (y elimina el primer registro leído porque ahora residirá en la memoria; o puede leer registros en lotes, por supuesto).
  4. Asigne a cada instancia de dicha cola un identificador de sistema de archivos seguro, para que pueda usarlo para crear un nombre de archivo seguro para el sistema de archivos. Además, para llevarlo más lejos, probablemente usaría el directorio de inicio del usuario actual como un lugar para que estas colas se serialicen en el disco.

De esta forma, el 99% de su cola serializada en el disco está lista, y usted solo pone su funcionalidad adicional exactamente en los lugares correctos. Necesitaría leer a fondo la documentación de la interfaz BlockingQueue de Java, pero bueno, vale la pena su tiempo porque solo agregará ese poco de funcionalidad adicional que necesita, en lugar de escribir todo desde cero.

Espero que esto ayude.

Cuestiones relacionadas