Tengo un algoritmo que actualmente asigna una gran variedad de dobles, que actualiza y busca con frecuencia. El tamaño de la matriz es N^2/2, donde N es el número de filas en las que opera el algoritmo. También tengo que guardar una copia de todo el contenido para fines relacionados con la aplicación que rodea el algoritmo.¿Cómo debo lidiar con una matriz muy grande en Java?
Por supuesto, esto impone un límite en el número de filas que mi algoritmo puede manejar ya que tengo que lidiar con la limitación del montón. Hasta este punto me he salido con la tarea de pedirle a las personas que usan el algoritmo que actualicen la configuración -Xmx para asignar más espacio, y eso ha funcionado bien. Sin embargo, ahora tengo un problema real en el que necesito que esta matriz sea más grande de lo que puedo guardar en la memoria.
Ya tengo planes para cambiar mi algoritmo para mitigar la necesidad de este gran conjunto y tener algunos resultados prometedores en ese dominio. Sin embargo, es una alteración fundamental del proceso y requerirá mucho más trabajo antes de que llegue a la condición muy pulida de mi código actual, que está funcionando en la producción con mucho éxito y lo ha sido durante varios años.
Por lo tanto, mientras estoy perfeccionando mi nuevo algoritmo, quería extender la vida del existente y eso significa abordar la limitación de montón asociada con la asignación de mi enorme variedad de dobles.
Mi pregunta es ¿cuál es la mejor manera de manejarlo? ¿Debo usar un nio FileChannel y un MappedByteBuffer, o hay un mejor enfoque? Si uso el enfoque nio, ¿qué tipo de impacto de rendimiento debo esperar en comparación con un arreglo en memoria del mismo tamaño?
Gracias
Supongo que no podría procesar los datos en trozos? – Seth
Desafortunadamente no con esta implementación. Eso es lo que hace mi nueva implementación, pero hay toda una serie de problemas adicionales asociados con la combinación de los resultados del fragmento de nuevo. – Simon
¿ha considerado utilizar una base de datos? – pstanton