Python-Liste Speicherfehler

Ich versuche, eine Liste mit 2 auf 30 Elemente zu machen, aber bekomme einen Speicherfehler. Warum so? Ist es außerhalb der Höchstgrenze einer Liste in Python?

m=[None]*(2**30) 

  • Liste der Listen vs Single List Speicher Nutzung in Python
  • Kopierliste in Python
  • Warum Python `Memory Error` mit der Liste` append () `Lose RAM links
  • Speicherfehler beim Analysieren großer Datei - Python
  • Was ist ein Affenflecken?
  • Python-Terminologie: Sachen nach links von "= argv" in Lernen Python die Hard Way-Übung 13
  • In Python, was bedeutet es, wenn ein Objekt ist abonnierbar oder nicht?
  • Python: Terminologie 'Klasse' VS 'Typ'
  • Was bedeutet Abstraktion in der Programmierung?
  • 2 Solutions collect form web for “Python-Liste Speicherfehler”

    Ja, es gibt eine Grenze, wie viele Elemente eine Python-Liste halten kann, siehe sys.maxsize . Du hast es aber nicht geschlagen; Sehr wenige Maschinen haben genug Speicher , um so viele Gegenstände zu halten.

    Sie versuchen, eine Liste mit 1073741824 Referenzen zu erstellen; Jede Referenz nimmt auch Speicher. Es hängt von deinem Betriebssystem ab, wie viel, aber in der Regel wird es 4 Bytes für ein 32-Bit-System, 8 Bytes für ein 64-Bit-Betriebssystem, wo 2 ^ 30 Elemente würde 4 GB oder 8 GB Speicher, nur für die Liste Referenzen .

    4GB plus andere Elemente ist schon einfach mehr als das, was die meisten aktuellen Betriebssysteme erlauben einen einzigen Prozess im Speicher zu verwenden.

    Auf meinem Mac OS X-Rechner (mit 64-Bit-OS) ist sys.maxsize 2 ^ 63 und Python-Objektreferenzen in einer Liste nehmen 8 Bytes ein:

     >>> import sys >>> sys.maxsize 9223372036854775807 >>> sys.maxsize.bit_length() 63 >>> sys.getsizeof([]) # empty list overhead 72 >>> sys.getsizeof([None]) - sys.getsizeof([]) # size of one reference 8 

    Also, um eine Liste mit sys.maxsize Elemente zu erstellen, sys.maxsize du 64 Exibibytes Speicher, nur für die Referenzen . Das ist mehr als das, was ein 64-Bit-Computer ansprechen könnte (das praktische Maximum beträgt etwa 16 Exbibytes ).

    All dies ignoriert den Speicherplatz, den die Objekte, auf die Sie in der Liste verweisen, nehmen wird. None ist ein Singleton, also wird es nur immer eine feste Menge an Gedächtnis nehmen. Aber vermutlich würden Sie in dieser Liste etwas anderes speichern, in diesem Fall müssen Sie das auch berücksichtigen.

    Und im Allgemeinen sollten Sie niemals eine so große Liste erstellen müssen . Verwenden Sie verschiedene Techniken; Erstellen Sie eine spärliche Struktur mit einem Wörterbuch zum Beispiel, ich bezweifle, dass Sie planen, alle diese 2 ^ 30 Indizes direkt in Ihrem Algorithmus zu adressieren, zum Beispiel.

    Sie versuchen, eine riesige Liste hier zu erstellen und Sie haben nicht genug kostenloses RAM, um dies zu tun. Wie viel RAM benötigen Sie?

    Es wird ungefähr 8 GB auf meiner Maschine sein. Sie finden die Größe von Keine auf Ihrer Maschine:

     import sys sys.getsizeof(None) # 16 here 

    Aber für eine Liste kannst du es so nähern:

     sys.getsizeof([None] * (2**20)) # 8388680 

    Und hoffe, dass für 2**30 wird es etwa 2**10 mal mehr werden Sie am Ende mit 8388680 * 2**10 die etwa 8 GB ist.

    Python ist die beste Programmiersprache der Welt.