Jetzt ergibt sich doch ein viel klareres Bild. Du hast also gar keinen Indexzugriff auf `results` sondern rufst eine Funktion auf.
Sowohl `list` als auch `keys` sind bei `list(node_ids.keys()):` überflüssig.
Das `del` hat wie schon geschrieben, keinen Einfluß und kann weg, ebenso das `collect`.
Die Funktion hat zu wenig Argumente und zu viele globale Variablen.
Um das Problem mal klarer zu haben:
Code: Alles auswählen
def write_results(nodescalars, node_ids_mentat, node_ids, t16file, ensfile, write_ascii, nscalar, compnodes):
write = ensfile.write_scalar_node_variable_time_step if write_ascii else ensfile.write_scalar_node_var_bina_time_step
for i, nscalar in enumerate(nodescalars):
res = {
node_id: t16file.node_scalar(node_ids_mentat[node_id], i)
for node_id in node_ids
}
write(nscalar, res, t16file.increment, compnodes)
Nun gibt es zwei Stellen, wo Speicher angehäuft werden könnten:
`t16file.node_scalar` oder `ensfile.write_scalar_node_variable_time_step`. Um das zu testen, kannst Du einfach nur node_scalar aufrufen:
Code: Alles auswählen
def write_results(nodescalars, node_ids_mentat, node_ids, t16file, ensfile, write_ascii, nscalar, compnodes):
for i, nscalar in enumerate(nodescalars):
for node_id in node_ids:
t16file.node_scalar(node_ids_mentat[node_id], i)
Wenn das den Speicher füllt, würde das bedeuten, dass dieses t16file nur bei Bedarf geladen wird und da Du mit der Zeit das ganze File brauchst, landet das mit der Zeit auch komplett im Speicher. Lösung wäre, das File bei jedem Loop neu zu öffnen und danach wieder zu schließen.
Liegt der Speicherverbrauch beim Speichern, dann mußt Du irgendwie dafür sorgen, dass die Daten tatsächlich geschrieben werden und nicht im Speicher bleiben. Da ich aber zu diesem ensfile keine Dokumentation gefunden habe, kann ich da nicht weiterhelfen.