Manipulando matrizes densas grandes em python

Basicamente, qual é a melhor maneira de armazenar e usar matrizes densas em python?

Eu tenho um projeto que gera métricas de similaridade entre cada item em uma matriz.

Cada item é uma classe personalizada e armazena um ponteiro para a outra classe e um número que representa sua "proximidade" com essa classe.

No momento, ele trabalha brilhantemente até cerca de 8.000 itens, após o que falha com um erro de falta de memória.
Basicamente, se você assumir que cada comparação usa ~ 30 (parece preciso com base em testes) bytes para armazenar a similaridade, isso significa que a memória total necessária é:
numItems^2 * itemSize = Memory
Portanto, o uso da memória é exponencial com base no número de itens.
No meu caso, o tamanho da memória é de ~ 30 bytes por link, então:
8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
que está no limite de memória para um único encadeamento.

Parece-me que deve haver uma maneira mais eficaz de fazer isso. Eu observei o mapeamento de memórias, mas ele já é computacionalmente intenso apenas para gerar os valores de similaridade, e gargalhar tudo isso através de um disco rígido parece um pouco ridículo.

Editar
Eu olhei entorpecido e covarde. Infelizmente, eles também não suportam matrizes muito grandes.

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

Editar mais
Numpy parece ser popular. No entanto, numpy realmente não fará o que eu quero, pelo menos sem outra camada de abstração.

Eu nãoquer para armazenar números, quero armazenar referência a classes. O Numpy suporta objetos, mas isso realmente não resolve os problemas de tamanho da matriz. Eu trouxe à tona apenas como um exemplo do quenão é trabalhando.

Algum conselho?

Editar Bem, acabei reescrevendo toda a lógica para não armazenar mais valores redundantes, reduzindo o uso de memória deO*n^2 paraO*((n*(n-1))/2).

Basicamente, todo esse caso é uma versão doproblema de aperto de mão, então, deixei de armazenar todos os links para apenas uma única versão de cada link.

Não é uma solução completa, mas geralmente não tenho conjuntos de dados grandes o suficiente para transbordar, então acho que vai dar certo. O PyTables é realmente interessante, mas eu não conheço SQL e não parece haver nenhuma maneira tradicional de fatiar ou indexar para acessar os dados da tabela. Eu posso revisitar a questão no futuro.

questionAnswers(6)

yourAnswerToTheQuestion