NumPy ist eine äußerst nützliche Bibliothek, und ich habe festgestellt, dass sie Matrizen verarbeiten kann, die recht groß sind (10000 x 10000), aber mit viel Größerem zu kämpfen haben (beim Versuch, eine Matrix von 50000 x 50000 zu erstellen) schlägt fehl). Dies liegt offensichtlich an den massiven Speicheranforderungen.
Gibt es eine Möglichkeit, riesige Matrizen in NumPy (z. B. 1 Million mal 1 Million) nativ zu erstellen (ohne mehrere Terrabyte RAM zu haben)?
numpy.array
s sollen in Erinnerung bleiben. Wenn Sie mit Matrizen arbeiten möchten, die größer als Ihr RAM sind, müssen Sie das umgehen. Es gibt mindestens zwei Ansätze, denen Sie folgen können:scipy.sparse.csc_matrix
.quelle
Sie sollten in der Lage sein, numpy.memmap zu verwenden, um eine Datei auf der Festplatte zu speichern. Bei neueren Python- und 64-Bit-Computern sollten Sie über den erforderlichen Adressraum verfügen, ohne alles in den Speicher laden zu müssen. Das Betriebssystem sollte nur einen Teil der Datei im Speicher behalten.
quelle
So behandeln dünn besetzte Matrizen, müssen Sie das
scipy
Paket , das von oben sitztnumpy
- siehe hier , um weitere Informationen über die spärlichen-Matrix - Optionen , diescipy
Ihnen gibt.quelle
Stefano Borinis Post brachte mich dazu zu untersuchen, wie weit so etwas schon ist.
Das ist es. Es scheint im Grunde zu tun, was Sie wollen. Mit HDF5 können Sie sehr große Datenmengen speichern und dann auf dieselbe Weise wie NumPy darauf zugreifen und sie verwenden.
quelle
Stellen Sie sicher, dass Sie ein 64-Bit-Betriebssystem und eine 64-Bit-Version von Python / NumPy verwenden. Beachten Sie, dass Sie auf 32-Bit-Architekturen normalerweise 3 GB Speicher adressieren können (wobei etwa 1 GB durch speicherabgebildete E / A und dergleichen verloren geht).
Mit 64-Bit- und Things-Arrays, die größer als der verfügbare RAM sind, können Sie mit virtuellem Speicher davonkommen, obwohl die Dinge langsamer werden, wenn Sie tauschen müssen. Speicherzuordnungen (siehe numpy.memmap) sind auch eine Möglichkeit, mit großen Dateien auf der Festplatte zu arbeiten, ohne sie in den Speicher zu laden. Sie müssen jedoch über einen 64-Bit-Adressraum verfügen, damit dies von großem Nutzen ist. PyTables erledigt das meiste auch für Sie.
quelle
Es ist ein bisschen Alpha, aber http://blaze.pydata.org/ scheint daran zu arbeiten, dieses Problem zu lösen.
quelle
Manchmal besteht eine einfache Lösung darin, einen benutzerdefinierten Typ für Ihre Matrixelemente zu verwenden. Basierend auf dem von Ihnen benötigten Nummernkreis können Sie ein Handbuch verwenden, das
dtype
speziell für Ihre Artikel kleiner ist. Da Numpy standardmäßig den größten Objekttyp berücksichtigt, kann dies in vielen Fällen hilfreich sein. Hier ist ein Beispiel:Und mit benutzerdefiniertem Typ:
quelle
Fragen Sie sich, wie Sie mit einer 2.500.000.000-Elementmatrix ohne Terabyte RAM umgehen sollen?
Die Möglichkeit, 2 Milliarden Elemente ohne 8 Milliarden Byte RAM zu verarbeiten, besteht darin, die Matrix nicht im Speicher zu halten.
Das bedeutet viel ausgefeiltere Algorithmen, um es in Teilen aus dem Dateisystem abzurufen.
quelle
(row, column, value)
Einträge speichern können .Wenn wir mit großen Matrizen arbeiten, implementieren wir sie normalerweise als Sparse-Matrizen .
Ich weiß nicht, ob Numpy spärliche Matrizen unterstützt, aber ich habe dies stattdessen gefunden.
quelle
Soweit ich über Numpy Bescheid weiß, nein, aber ich könnte mich irren.
Ich kann Ihnen diese alternative Lösung vorschlagen: Schreiben Sie die Matrix auf die Festplatte und greifen Sie in Blöcken darauf zu. Ich schlage Ihnen das HDF5-Dateiformat vor. Wenn Sie es transparent benötigen, können Sie die ndarray-Schnittstelle erneut implementieren, um Ihre auf der Festplatte gespeicherte Matrix in den Speicher zu paginieren. Seien Sie vorsichtig, wenn Sie die Daten so ändern, dass sie wieder auf der Festplatte synchronisiert werden.
quelle