libreria - matrix algebra in java
Manejar una gran estructura de datos en Java (9)
Bueno, si se ve obligado a usar Java y no puede escribir el código que trata con esto como métodos nativos (es decir, al decirle a Java que llame a algún código C), entonces lo más eficiente sería usar un simple archivo binario. Me mantendría alejado de las bases de datos en este caso porque son más lentos que el acceso directo a archivos y no necesita las características que ofrecen.
Estoy trabajando en una aplicación Java que necesita trabajar en matrices muy grandes. Por ejemplo, ¡multiplicando dos matrices de 10 millones * 10 millones! Por supuesto, el montón de Java no tiene suficiente espacio incluso para almacenar una de estas matrices. ¿Que debería hacer? ¿Debería usar bases de datos para almacenar mis matrices y llevar a la memoria cada parte necesaria y multiplicarla parte tras otra?
Dado que este es un cálculo tan grande, creo que se encontrará con problemas de rendimiento junto con sus problemas de almacenamiento. Entonces, analizaría la posibilidad de paralelizar este problema y obtener múltiples máquinas / núcleos para procesar un subconjunto de datos.
Afortunadamente, una solución de multiplicación de matriz se descompondrá naturalmente. Pero estaría buscando alguna forma de grilla o solución informática distribuida.
Echa un vistazo a hadoop .
Eche un vistazo a CGL-MapReduce http://www.cs.indiana.edu/~jekanaya/cglmr.html#Matrix_Multiplication
Intente utilizar Memory Mapped File almacenando todos sus datos en un archivo externo y acceda a él a través del objeto FileChannel.
Vea este artículo para una breve introducción a MMF.
La complejidad de la multiplicación de matrices, si se lleva a cabo ingenuamente, es O (n ^ 3), pero existen algoritmos más eficientes. De todos modos, para una matriz de 10 millones * 10 millones esto llevará mucho tiempo y es posible que se enfrente al mismo montón de probelmas pero con recursividad.
Si le gustan las matemáticas complejas, puede encontrar una herramienta para ayudarlo en este artículo .
Use cualquier algoritmo de matriz dispersa que se aplique a sus datos. (suponiendo que no tiene 2.4 PB de espacio en disco para contener 3 matrices de dobles cuadradas no dispersas de 10 ^ 8, y mucho menos esa cantidad de RAM para una base de datos en memoria - Blue Gene / Q ''solo'' tiene 1.6 PB)
considere usar un db de memoria como http://hsqldb.org/
En primer lugar, una matriz de 10 millones x 10 millones es simplemente enorme. Suponiendo que se dupliquen para cada celda y no se almacene en exceso, cada una de estas cosas será de 800 terabytes. Solo leer cada celda una vez más desde la memoria principal (si de alguna manera encaja mágicamente allí, lo que claramente no está sucediendo), tomaría días. Hacerlo desde cualquier tipo de SAN plausible (lo pondremos en 10GbE) es más probable que sea meses. Y ninguna matriz multiplicada tiene O (n) complejidad - los enfoques normales son O (n ^ 3). Entonces ... no está haciendo esto con archivos mapeados en la memoria, bases de datos comunes, ni nada por el estilo.
El código que hace algo como esto va a vivir o morir en la eficiencia de la memoria caché, donde "caché" incluye hacer un buen uso de la memoria principal, las unidades de disco locales. Dado que cualquier interfaz de almacenamiento que contenga más de una matriz de 800 terabytes seguramente será una SAN de algún tipo, es casi seguro que involucre servidores múltiples que lean y trabajen en diferentes partes de la misma.
Hay muchas formas bien conocidas de paralelizar la multiplicación de matrices (esencialmente multiplicar submatrices de varios tamaños y luego combinar los resultados) y cambiar el diseño para que los patrones de acceso tengan una localidad de caché razonable organizando los datos alrededor de las curvas de relleno de espacio de arreglos de fila / columna. Seguramente querrá ver las interfaces y el diseño clásicos de LAPACK , Intel MKL , GotoBLAS como implementaciones de las funciones de BLAS adaptadas a hardware moderno específico, y después de eso probablemente se esté aventurando en un territorio inexplorado :-)