2013-04-22 5 views
22

Ich versuche, Algorithmen für 1000-dimensionale Daten mit 200k + Datenpunkte in Python zu implementieren. Ich möchte numpy, scipy, sklearn, networkx und andere nützliche Bibliotheken benutzen. Ich möchte Operationen wie die paarweise Entfernung zwischen allen Punkten durchführen und Clustering an allen Punkten durchführen. Ich habe funktionierende Algorithmen implementiert, die mit angemessener Komplexität ausführen, was ich will, aber wenn ich versuche, sie auf alle meine Daten zu skalieren, läuft mir der Arbeitsspeicher aus. Natürlich tue ich, die Erstellung der Matrix für paarweise Entfernungen auf 200k + Daten erfordert viel Speicher.Arbeiten mit großen Daten in Python und numpy, nicht genug RAM, wie partielle Ergebnisse auf der Festplatte speichern?

Hier kommt der Haken: Ich würde wirklich gerne auf beschissenen Computern mit geringen Mengen von RAM tun.

Gibt es einen durchführbaren Weg für mich, dies ohne die Einschränkungen der niedrigen Ram arbeiten zu können. Dass es viel länger dauern wird, ist wirklich kein Problem, solange die Zeit nicht ins Unendliche geht!

Ich würde gerne in der Lage sein, meine Algorithmen zur Arbeit zu bringen und dann eine Stunde oder fünf später wieder zu kommen und es nicht hängen zu lassen, weil es aus dem Widder lief! Ich möchte dies in Python implementieren und in der Lage sein, die numpy, scipy, sklearn und networkx Bibliotheken zu verwenden. Ich möchte in der Lage sein, die paarweise Entfernung zu all meinen Punkten usw. zu berechnen.

Ist das machbar? Und wie würde ich darüber reden, woran kann ich anfangen zu lesen?

Mit freundlichen Grüßen // Mesmer

+0

Ihre Frage ist ziemlich vage und sehr breit. Sie sind ziemlich normale Datengrößen für viele Anwendungen in der Signalverarbeitung und beim maschinellen Lernen. Ich schlage vor, herauszufinden, über die Algorithmen und Techniken in diesen Bereichen verwendet werden. –

+3

Ich möchte zum Beispiel paarweise Entfernung zwischen allen Punkten in einer 200.000 x 1000-Matrix in Python durchführen können, ohne genug RAM zu haben, um die gesamte Distanzmatrix im Speicher zu halten. Ich bin auf der Suche nach Informationen, wie man das macht :) Konkretere Antworten, dann ein vager "Blick in zwei ganze Teilbereiche der Informatik" wären hilfreich! – Ekgren

+6

Wahrscheinlich möchten Sie sich die [memmap] von numpy (http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html) und möglicherweise [PyTables] (http: // www. pytables.org) als Ausgangspunkt. –

Antwort

31

Mit numpy.memmap Sie erstellen Arrays direkt in eine Datei zugeordnet:

import numpy 
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000)) 
# here you will see a 762MB file created in your working directory  

Sie können es als ein herkömmliches Array behandeln: a + = 1000.

Es ist möglich, auch mehrere Arrays zuweisen zu die gleiche Datei, die bei Bedarf von anderen Quellen aus kontrolliert wird. Aber ich habe hier einige knifflige Dinge erlebt. So öffnen Sie die vollständige Palette Sie die vorherige erste zu „schließen“ haben, mit del:

del a  
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000)) 

Aber openning nur ein Teil des Arrays ermöglicht es, die gleichzeitige Steuerung zu erreichen:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000)) 
b[1,5] = 123456. 
print a[1,5] 
#123456.0 

Groß! a wurde zusammen mit b geändert. Und die Änderungen sind bereits auf der Festplatte geschrieben.

Die andere wichtige Sache lohnt sich zu kommentieren ist die offset. Angenommen, Sie nicht die ersten 2 Zeilen in b nehmen wollen, aber Linien 150,000 und 150001.

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000), 
       offset=150000*1000*32/8) 
b[1,2] = 999999. 
print a[150001,2] 
#999999.0 

Jetzt können Sie einen beliebigen Teil des Arrays in gleichzeitigen Operationen zugreifen und diese aktualisieren. Beachten Sie die Byte-Größe in der Offset-Berechnung. Für ein 'float64' wäre dieses Beispiel beispielsweise 150000 * 1000 * 64/8.

Weitere Referenzen:

0

Sie könnten nur den virtuellen Speicher auf der OS-Rampe und 64-Bit-Python verwenden, es ist ein 64-Bit-Betriebssystem bereitstellt.

+0

Warum sagen Sie, "es ist ein 64-Bit-Betriebssystem"? Verwendet 32-Bit-Python keinen virtuellen Speicher? Ich frage, weil ich auf Speicherfehler stoße, von denen ich dachte, dass sie durch das Erweitern der virtuellen Windows7-Auslagerungsdatei behoben werden würden, aber sie blieben genau das gleiche. – Lobotomik

+2

32-Bit-Prozesse sind auf 2 GB RAM beschränkt (virtuell oder nicht). Dies liegt daran, dass 32 Bits nur die Adressierung von 4 Gb erlauben und das OS 2 Gb reserviert. Es ist möglich, dies zu 3Gb/1 GB zu optimieren, aber das ist Ihre Grenze. Die einzige andere Möglichkeit ist, Ihr Programm in separate Prozesse unter Verwendung des Multiprocess-Moduls aufzuteilen, die jeweils auf 2 GB beschränken. – xorsyst