Handling von großen dichten Matrizen in Python

Was ist der beste Weg, um dichte Matrizen in Python zu speichern und zu verwenden?

Ich habe ein Projekt, das Ähnlichkeitsmetriken zwischen jedem Element in einem Array generiert.

Jedes Element ist eine benutzerdefinierte Klasse und speichert einen Zeiger auf die andere Klasse und eine Zahl, die die "Nähe" zu dieser Klasse angibt.

Right now, es funktioniert brillant bis zu etwa ~ 8000 Elemente, danach schlägt es mit einem Fehler wegen Speichermangel fehl.
enn Sie davon ausgehen, dass jeder Vergleich ~ 30 (scheint auf der Grundlage von Tests genau zu sein) Bytes verwendet, um die Ähnlichkeit zu speichern, bedeutet dies im Grunde, dass der gesamte erforderliche Speicher wie folgt lautet:
numItems^2 * itemSize = Memory
So ist die Speichernutzung abhängig von der Anzahl der Elemente exponentiell.
In meinem Fall beträgt die Speichergröße ~ 30 Bytes pro Link, also:
8000 * 8000 * 30 = 1,920,000,000 bytes, or 1.9 GB
Das ist genau an der Speichergrenze für einen einzelnen Thread.

s scheint mir, dass es einen effektiveren Weg geben muss, dies zu tun. Ich habe mir Memmapping angesehen, aber es ist bereits rechenintensiv, nur um die Ähnlichkeitswerte zu generieren, und es scheint ein wenig lächerlich, alles durch eine Festplatte zu beeinträchtige

Bearbeite
Ich habe mich numpy und scipy angesehen. Leider unterstützen sie auch keine sehr großen Arrays.

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

Weiter bearbeiten
Numpy scheint beliebt zu sein. Allerdings macht numpy nicht wirklich das, was ich will, zumindest ohne eine weitere Abstraktionsebene.

Ich nichtwolle Zum Speichern von Zahlen möchte ich Verweise auf Klassen speichern. Numpy unterstützt Objekte, behebt jedoch die Probleme mit der Arraygröße nicht wirklich. Ich habe numpy nur als Beispiel für das, was ist nicht Arbeiten

Irgendein Rat

Bearbeite Nun, ich habe gerade die gesamte Logik umgeschrieben, damit keine redundanten Werte mehr gespeichert werden und die Speichernutzung von @ reduziert wirO*n^2 zuO*((n*(n-1))/2).

rundsätzlich ist diese ganze Angelegenheit eine Version des Handshake Problem, daher habe ich von der Speicherung aller Links auf eine einzige Version jedes Links umgestellt.

Es ist keine vollständige Lösung, aber ich habe im Allgemeinen keine Datensätze, die groß genug sind, um sie zu überschwemmen. Ich denke, das wird funktionieren. PyTables ist wirklich interessant, aber ich kenne kein SQL und es scheint keine nette traditionelle Methode zu geben, die auf Slicing oder Index basiert, um auf die Tabellendaten zuzugreifen. Ich werde das Problem möglicherweise in Zukunft erneut behandeln.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage