2017-01-10 1 views
-3

Ich arbeite an einer Programmieraufgabe mit schneller Verarbeitung und großen Datenmengen. Ich versuche, eine Liste möglicher Permutationen eines Zahlenbereichs zu erstellen und dann durch sie zu suchen.Liste mit 13 Gigs Ram mit 127 mil Einträgen: wie?

Code:

def generate_list(numA, numB): 
    combo = list(range(0, numB)) 
    permutation_list = list(itertools.permutations(combo, numA)) 
    print("initial dictionary length: " + len(permutation_list)) 

Das Problem ist, dass, wenn A 6 und B 25, mein Programm verlangsamt sich immens und nimmt eine riesige Menge an RAM. Es guckte auf etwa 13 Gigs. Die Länge der Liste beträgt ungefähr 127 Milli-Inch und jedes Objekt hat die Länge 6. Das sollte ungefähr 750 Megabyte Speicher und nicht 13 Gigs betragen. Was ist los?

Edit: Die Daten sind nur Zahlen. Also [[0,1,2,3,4,5], [0,1,2,3,4,6], ...]

+0

Welche Herausforderung ist das? Irgendeine Möglichkeit, auf die Beschreibung und die Daten zuzugreifen? – ppasler

+0

Die Daten sind nur Zahlen. Also [[0,1,2,3,4,5], [0,1,2,3,4,6], ...] – Smipims

+0

Ich habe einen Fehler gemacht. Ich meinte Liste, wo immer ich das Wörterbuch eintippte – Smipims

Antwort

2

Jedes Element einer Liste oder eines Tupels ist ein Zeiger. Und hat eine Größe von entweder 4 oder 8 Bytes. Das Folgende nimmt Letzteres an. Zählen nur die Zeiger in der Liste und Tupel entfallen auf die Hälfte des Speicherplatzes. Der Rest ist wahrscheinlich der Objektkopf, der etwa 48 Bytes groß ist. Dies ergibt die Formel:

(48+8+(8*6)) * 127000000 == 13208000000 

was etwa 13 Gigabyte ist.

Ich würde vorschlagen, alles Mögliche zu tun, um zu vermeiden, dass die vollständige Permutation erzeugt wird.

+0

Danke! Ich dachte, ich müsste es anders machen, aber es ist immer gut zu wissen, warum ich scheiterte, nicht nur, dass ich versagte. – Smipims

-1

Ein Beispiel, wie Sie könnte die gesamte Liste der Permutationen Ausgabe könnte wie folgt aussehen:

import itertools 

def combo(b): 
    for combination in range(0, b): 
     yield combination 

def generate_list(numA, numB): 
    for l in itertools.permutations(combo(numB), numA): 
     yield list(l), len(l) 

if __name__ == '__main__': 
    total_length = int() 
    with open('permutations', 'w+') as f: 
     f.write('[') 
     for permutation in generate_list(6, 25): 
      data, length = permutation 
      total_length += length 
      f.write(str(data) + ', ') 
     f.write(']\n') 
    print("initial dictionary length: " + str(total_length)) 

Ich habe den Code in zwei separate Generatoren eingeschaltet. Eine, die die Kombination ergibt, eine andere, die die Permutation angibt.

Sie können die gesamte Sache ohne MemoryError berechnen und in eine Datei schreiben. A sehr große Datei. Oder Sie könnten es einfach ausdrucken, bis zu Ihnen.

Es wird Ihnen auch die Länge am Ende sagen, ohne dass große Mengen an Speicher dafür erforderlich sind.

Verwandte Themen