Manejo de grandes matrices densas en python

Básicamente, ¿cuál es la mejor manera de almacenar y usar matrices densas en python?

Tengo un proyecto que genera métricas de similitud entre cada elemento de una matriz.

Cada elemento es una clase personalizada y almacena un puntero a la otra clase y un número que representa su "cercanía" a esa clase.

En este momento, funciona de manera brillante hasta aproximadamente ~ 8000 elementos, después de lo cual falla con un error de falta de memoria.
Básicamente, si asume que cada comparación usa ~ 30 bytes (parece exacto basado en pruebas) para almacenar la similitud, eso significa que la memoria total requerida es:
numItems^2 * itemSize = Memory
Por lo tanto, el uso de la memoria es exponencial en función del número de elementos.
En mi caso, el tamaño de la memoria es de ~ 30 bytes por enlace, entonces:
8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
que está justo en el límite de memoria para un solo hilo.

Me parece que tiene que haber una forma más efectiva de hacer esto. He examinado el mapeo de la memoria, pero ya es computacionalmente intenso solo para generar los valores de similitud, y poner un cuello de botella en todo a través de un disco duro parece un poco ridículo.

Editar
He mirado numpy y scipy. Desafortunadamente, tampoco admiten matrices muy grandes.

>>> np.zeros((20000,20000), dtype=np.uint16)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>

Editar más
Numpy parece ser popular. Sin embargo, numpy realmente no hará lo que quiero, al menos sin otra capa de abstracción.

Yo noquerer para almacenar números, quiero almacenar referencias a clases. Numpy admite objetos, pero eso realmente no aborda los problemas de tamaño de la matriz. Mencioné numpy solo como un ejemplo de lo queno es trabajando.

¿Algún consejo?

Editar Bueno, terminé reescribiendo toda la lógica para que ya no almacene ningún valor redundante, reduciendo el uso de memoria deO*n^2 aO*((n*(n-1))/2).

Básicamente, todo este asunto es una versión delproblema de apretón de manos, así que pasé de almacenar todos los enlaces a una sola versión de cada enlace.

No es una solución completa, pero generalmente no tengo ningún conjunto de datos lo suficientemente grande como para desbordarlo, así que creo que funcionará. PyTables es realmente interesante, pero no conozco ningún SQL, y no parece haber ninguna forma de corte o índice tradicional de acceso a los datos de la tabla. Puedo volver a visitar el tema en el futuro.

Respuestas a la pregunta(6)

Su respuesta a la pregunta