Seite 1 von 2
Python mit viel Ram
Verfasst: Mittwoch 5. Mai 2010, 10:32
von kaju
Hallo,
gibt es eine unkomplizierte Möglichkeit Python mehr 2GB Ram zuordnen zu können?
Wie sieht es mit Windows 7 64 Bit aus? Reicht es schon, wenn ich das installiere oder müßte ich dann auch den 64 Bit Python Compiler nehmen. Spricht etwas dagegen den 64 Bit Python Compiler zu nehmen?
Wie sieht es in der Linux Welt aus?
Verfasst: Mittwoch 5. Mai 2010, 10:34
von Darii
Warum sollte es überhaupt Probleme mit mehr als 2 GiB RAM geben? Die Grenze ist mit 32 bit bei 4 GiB.
Edit: Hmm offensichtlich ist das eine Windows Beschränkung. Bei Linux weiß ich nicht, hängt vermutlich vom verwendeten System ab

Bei Ubuntu gibts z.B. Standardmäßig kein PAE deshalb wird das Limit mindestens irgendwo bei < 4 GiB pro Prozess liegen.
Bei OSX gibt es auf jeden Fall mit 32 bit 4 GiB pro Prozess und ich glaube 64 GiB max(oder das was grad in den Mac reinpasst hängt ja auch vom Mainboard ab).
Verfasst: Mittwoch 5. Mai 2010, 11:20
von Leonidas
Also mein Python kann mit mehr als 2 GB RAM umgehen, ist ein 64-Bit Python auf einem 64-Bit Linux.
Verfasst: Mittwoch 5. Mai 2010, 12:55
von ms4py
Mein Testprogramm crasht schon bei ~500 MB (Win7 64bit, Python 32bit)
Code: Alles auswählen
>>> l = []
>>> while True:
... l.append(1)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
MemoryError
(Hätte natürlich entsprechend mehr Resourcen zur Verfügung -> 4GB RAM)
Verfasst: Mittwoch 5. Mai 2010, 13:20
von jens
Hab das selbe skript laufen lassen und mit process explorer von sysinternals nachgesehen. Bricht ab mit:
Peak Private Bytes: 5.165.360 K
Peak Working Set: 4.323.936 K
In der "Private Bytes" History steht am Ende dann: 2.3 GB Wobei da deutliche Spitzen zu sehen sind (Was ich merkwürdig finde)
Win7 64Bit, Python 2.6 32Bit
Das ganze sieht dann so aus:

Verfasst: Mittwoch 5. Mai 2010, 13:49
von BlackJack
@jens: Die Spitzen sind bei der Art von dynamischen Arrays, die Python für Listen verwendet zu erwarten. Immer wenn der Platz nicht mehr ausreicht wird ein neues ca. doppelt so grosses Array angefordert, das alte da rüberkopiert und dann freigegegen. So erreicht man das `append()` armortisiert in O(1) Zeit pro Aufruf läuft.
Verfasst: Mittwoch 5. Mai 2010, 14:00
von ms4py
Seltsam. Warum komm ich nur auf 500 MB?!

Verfasst: Mittwoch 5. Mai 2010, 14:02
von kaju
Mh wird wohl auf 64 bit linux + 64 bit python rauslaufen. Muss ich nur mal schauen, ob alle packete die ich so brauche dort auch laufen werden.
Verfasst: Mittwoch 5. Mai 2010, 14:30
von nemomuk
@ms4py: vllt. weil nicht mehr genügend Speicher vorhanden ist um das nächstgrößere Arrays anzufordern? Aber eigentlich hab ich keine Ahnung...
Verfasst: Mittwoch 5. Mai 2010, 14:44
von ms4py
ahojnnes hat geschrieben:@ms4py: vllt. weil nicht mehr genügend Speicher vorhanden ist um das nächstgrößere Arrays anzufordern? Aber eigentlich hab ich keine Ahnung...
Nope, kann eigentlich nicht sein

Verfasst: Donnerstag 6. Mai 2010, 07:57
von jens
@ms4py: welche Python Version hast du genau?
Meine ist:
Python 2.6.4 (r264:75708, Oct 26 2009, 07:36:50) [MSC v.1500 64 bit (AMD64)] on win32
Somit hab ich wohl nicht die 32Bit, sondern die 64Bit Variante installiert. Dann ist aber auch hier die Frage, warum bei 2GB Schluss ist. Speicher ist genügend frei.
Verfasst: Donnerstag 6. Mai 2010, 08:20
von veers
2GB is das "User-mode virtual address space for each 32-bit process" für 32 bit Windows:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Gruss,
Jonas
Verfasst: Donnerstag 6. Mai 2010, 09:01
von ms4py
jens hat geschrieben:@ms4py: welche Python Version hast du genau?
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Verfasst: Samstag 8. Mai 2010, 10:00
von sma
Mit ziemlicher Sicherheit benutzt auch Python für Listen den üblichen Algorithmus, der ein vordefiniertes Array mit Kapazität C wachsen lässt, indem ein neues Array mit Kapazität C*N (wobei N relativ nahe an 2 liegt) angelegt wird und alle existierenden Referenzen in das neue Array kopiert werden. Das geht schnell, braucht aber viel Speicher, wenn das Array groß wird. Ein besserer Speichertest wäre daher `[None] * count`, da ich annehme, dass hier die Liste automatisch auf die richtige Größe gesetzt wird.
Stefan
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 16:24
von kaju
Gibt es denn irgendwelche Obergrenzen an Arbeitsspeicher, welches ein 64 Bit Python addressieren kann? Wir haben hier nur Anwendung mit extrem viel Daten und es wäre interessant, ob es sich lohnen würde einen entsprechend teuren Rechner zu kaufen.
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 17:05
von jbs
kaju hat geschrieben:Gibt es denn irgendwelche Obergrenzen an Arbeitsspeicher, welches ein 64 Bit Python addressieren kann? Wir haben hier nur Anwendung mit extrem viel Daten und es wäre interessant, ob es sich lohnen würde einen entsprechend teuren Rechner zu kaufen.
Was verstehst du denn unter teuer? Werden überhaupt noch Mainstreamprozessoren ohne 64bit Unterstützung gefertigt?
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 17:18
von ms4py
Die Frage ist auch, ob es wirklich sinnvoll ist mit großen Daten im RAM zu arbeiten. Ich würde eher in Richtung einer schnellen Festplatte (-> SSD) investieren (wenn das überhaupt notwendig ist) und mit einem DBS arbeiten!
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 17:21
von nemomuk
Wie viel RAM ein Prozess einnehmen kann ist doch auch immer eine Frage des Betriebssystems und zumindest unter Linux eine Frage, wie der Kernel kompiliert wurde.
Python hat meines Wissens selbst kein max. Memory limit, bitte korrigiert mich, wenn ich falsch liege.
Wie ms4py schon erwähnt, ist es auch nicht unbedingt eine gute Idee allzu viel Daten im RAM liegen zu lassen.
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 17:35
von kaju
Bzgl. Festplatte. Das habe ich auch schon überlegt. Wie viel mehr Tranferrate hat denn so eine SDD Festplatte?
Wir arbeiten mit EEG Daten. Und wenn wir nicht selbst tricksen wollen müssen die Daten alle gleichzeitig im Hauptspeicher sein. DBS halte ich also für nicht sinnvoll. Bzw. selbst wenn. würde sich der Aufwand nicht lohnen ein Interace/Converter für eine DBS zu schreiben für alle anderen Programme.
Das Betriebsystem ist egal. Hauptsache es geht unter einem. Ubuntu 64 wäre optimal. Kann jemand einfach mal probieren, ob er mit seiner Python 64Bit Version mehr als 10GB Hauptspeicher addressieren kann?
Re: Python mit viel Ram
Verfasst: Montag 10. Mai 2010, 17:37
von jbs
ahojnnes hat geschrieben:Wie ms4py schon erwähnt, ist es auch nicht unbedingt eine gute Idee allzu viel Daten im RAM liegen zu lassen.
Was ist zum Beispiel mit redis?