Seite 1 von 1

Memory Error bei riesigem Skript

Verfasst: Donnerstag 26. August 2010, 17:26
von Hand
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.

Re: Memory Error bei riesigem Skript

Verfasst: Donnerstag 26. August 2010, 18:02
von BlackJack
@Hand: Ich würde es mit einer Datendatei angehen und einen "Interpreter" dafür schreiben.

Re: Memory Error bei riesigem Skript

Verfasst: Mittwoch 1. September 2010, 12:59
von sma
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