2015-09-20 18 views
5

Python 3 Ganzzahlen haben unlimited precision. In der Praxis ist dies durch den Speicher eines Computers begrenzt.Python Infinite Ganzzahlen

Betrachten Sie den followng Code:

i = 12345 
while True: 
    i = i * 123 

Das ist offensichtlich fehl. Aber was wird das Ergebnis sein? Der gesamte RAM (und die Auslagerungsdatei) wurde mit dieser einen ganzen Zahl gefüllt (mit Ausnahme des von anderen Prozessen belegten Speicherplatzes).

Oder gibt es eine Sicherheitsvorkehrung, um dies zu erfassen, bevor es so weit kommt?

+1

Sie werden einen MemoryError treffen –

+0

So werden die meisten RAM und Auslagerungsdatei überschrieben? – mcu

+0

Hängt davon ab, was das Betriebssystem zulässt und ob "i" als Null gestartet wurde oder nicht. –

Antwort

1

Sie können überprüfen, was passiert, ohne zu riskieren, den gesamten verfügbaren Speicher zu füllen. Sie könnten set the memory limit explicitly:

#!/usr/bin/env python 
import contextlib 
import resource 

@contextlib.contextmanager 
def limit(limit, type=resource.RLIMIT_AS): 
    soft_limit, hard_limit = resource.getrlimit(type) 
    resource.setrlimit(type, (limit, hard_limit)) # set soft limit 
    try: 
     yield 
    finally: 
     resource.setrlimit(type, (soft_limit, hard_limit)) # restore 

with limit(100 * (1 << 20)): # 100MiB 
    # do the thing that might try to consume all memory 
    i = 1 
    while True: 
     i <<= 1 

Dieser Code verbraucht 100% CPU (auf einem einzelnen Kern) und der verbrauchte Speicher wächst sehr langsam.

Im Prinzip sollten Sie MemoryError irgendwann bekommen, ob es passiert, bevor Ihr Computer zu Staub wird unklar ist. CPython uses a continuous block of memory to store the digits und daher können Sie den Fehler auch erhalten, wenn RAM verfügbar, aber fragmentiert ist.

Ihr spezifischer Code sollte es nicht auslösen, aber im Allgemeinen könnten Sie auch OverflowError if you try to construct an integer larger than sys.maxsize bytes erhalten.

+0

Also, nicht in die Auslagerungsdatei dann verschütten, weil es nicht kontinuierlich wäre. – mcu

+0

@ coding4fun: Python ist es egal, woher der Speicher kommt. Ob OS pagefile verwendet oder nicht, ist für Python völlig transparent. Es sieht so aus, als ob der Algorithmus zu langsam ist, um den Speicher trotzdem zu füllen. – jfs