ich habe ein Problem mit einem recht komplexen Programm, welches mit Hilfe von OOP immer auf ein Hauptobjekt
zugreift und das mit Hilfe verschiedener Funktionen von aussen schrittweise mit Daten füllt.
Bei einer bestimmten Datenmenge steigt das ganze mit MemoryError aus und ich hab das Gefühl, dass die Strategie,
dieses Hauptobjekt immer in der Argumentliste mitzuführen vielleicht der Grund dafür ist, dass das ganze mit einem
MemoryError endet.
(Evtl. macht Python dann daraus einen Call-by-Value und dupliziert die Daten?)
(Oder ist das ganze zu unsauber, wenn Daten in das Hauptobjekt geschrieben werden?)
Ich hab das ganze mal versucht auf ein kleines Beispiel herunterzubrechen, welches ungefähr den Datenfluss simuliert.
Das Hauptobjekt AllData sammelt alle Daten und Unterprogramme lesen und schreiben fleissig auf diesen Daten.
Könntet ihr mal schauen, ob diese Art des Datanhandlings evtl der Grund für Speicherprobleme sind?
Wie könnte man das ganze anders aufsetzen ohne das gesamte Memory Model umzuwerfen?
Gibt es Möglichkeiten zwischendurch den Speicher freizuschaufeln, der unnütz herumliegt? (del ? aber wo ansetzen?)
Danke
Code: Alles auswählen
class AllData:
def __init__(self):
self.data_a = DataA()
self.data_b = DataB()
self.data_c = DataC()
# -------------------------------------------------------------------------
class DataA:
def __init__(self): self.data_dict = {}
def add_data_to_dict(self, id, data_obj): self.data_dict[id] = data_obj
def get_len_data_a(self): return len(self.data_dict)
class ObjA:
def __init__(self, name): self.name = name
# -------------------------------------------------------------------------
class DataB:
def __init__(self): self.data_dict = {}
def add_data_to_dict(self, id, data_obj): self.data_dict[id] = data_obj
def get_len_data_b(self): return len(self.data_dict)
class ObjB:
def __init__(self, name): self.name = name
# -------------------------------------------------------------------------
class DataC:
def __init__(self): self.data_dict = {}
def add_data_to_dict(self, id, data_obj): self.data_dict[id] = data_obj
def get_len_data_c(self): return len(self.data_dict)
class ObjC:
def __init__(self, name): self.name = name
# -------------------------------------------------------------------------
def ctrl_a(all_data): create_a_objects(all_data)
def ctrl_b(all_data): create_b_objects(all_data)
def ctrl_c(all_data): create_c_objects(all_data)
# -------------------------------------------------------------------------
def create_a_objects(all_data):
inst_a = ObjA("name_01")
all_data.data_a.add_data_to_dict(1,inst_a)
def create_b_objects(all_data):
inst_b = ObjB("name_02")
all_data.data_b.add_data_to_dict(2,inst_b)
def create_c_objects(all_data):
if all_data.data_a.get_len_data_a() > 0:
inst_c = ObjC("name_03")
all_data.data_c.add_data_to_dict(100,inst_c)
all_data.data_a.add_data_to_dict(100,inst_c)
# --- main ----------------------------------------------------------------
all_data = AllData()
ctrl_a(all_data)
ctrl_b(all_data)
ctrl_c(all_data)
print all_data.data_a.get_len_data_a()
# -------------------------------------------------------------------------