Memory Error bei riesigem Skript

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hand
User
Beiträge: 65
Registriert: Sonntag 28. Januar 2007, 14:28

Hallo,

von einem CAD-Programm lasse ich ein Python-Script generieren, das dann mittels Exec() ausgefuehrt wird.

Das ganze wird von einem Masterprogramm, das einen integrierten Editor besitzt interpretiert.
Sozusagen ein Scriptinterpreter in einem Python Programm.

In dem Skript stehen nur ein paar kleine Funktionen, und sonst nur Kontourdaten.

Z.B.

Code: Alles auswählen


def init():
    scr.Init()

init()
scr.JumpXY(10,2)
scr.MoveXY(11,2)
scr.MoveXY(12,2)
scr.MoveXY(13,2)
scr.MoveXY(14,2)
scr.MoveXY(15,2)
scr.MoveXY(16,2)
Insgesamt ca. 3.000.000 Zeilen.
Das ganze ist leider viel zu groß fuer einen einzelnen Aufruf mittels exec:

Code: Alles auswählen

f = open("test.py")
s = f.read()
f.close()

exec(s)

Gibt ex eine moeglichkeit Zeile fuer Zeile zu interpretieren, wie in der Python console, damit diese Datenmenge interpretiert werden kann?

Alternativ faellt mir nur noch ein, nur die Koordinaten in ein Datenfile (z.B. XML) zu speichern,
und dieses dann via Python auszulesen und auszufuehren.
BlackJack

@Hand: Ich würde es mit einer Datendatei angehen und einen "Interpreter" dafür schreiben.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die 3 Millionen Zeilen überlasten wohl den Interpreter. Erzeugen ist einfach, einlesen auch, aber dann schwillt bei mir der Python-Prozess auf 2,5 GB RAM an und danach passiert dann nicht mehr viel. Ich glaube, er bekommt von meinem OS keinen weiteren Speicher, schließlich habe ich auch noch andere Programme laufen. Vielleicht klappt's ja, wenn man 8 GB oder so frei hat.

Code: Alles auswählen

with open("/tmp/a.py", "w") as f:
    f.write("def move(x,y): pass\n")
    for i in range(3000000):
        f.write("move(10,10)\n")

#entweder
#with open("/tmp/a.py") as f:
#    s = f.read()
#exec s
#oder besser
execfile("/tmp/a.py")
Wesentlich besser wäre aber, die Daten nicht alle als Programm zu laden, sondern ein Programm die Daten Zeile für Zeile laden zu lassen.

Code: Alles auswählen

import re

def move(x, y): pass

for line in open("/tmp/a.py"):
    m = re.match(r"move\((\d+),(\d+)\)", line)
    if m:
        move(int(m.group(1)), int(m.group(2)))
Stefan
Antworten