Probelm in Ram...

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
nov
User
Beiträge: 10
Registriert: Mittwoch 26. Juli 2006, 17:03

Hallo alle,

Ich habe hier eine dumme Frage, wie ich die Ram größer einstellen kann, wenn ich die Python-skripts laufen.

Die Workstation hat 12GB ram, aber durch "top" sehe ich, dass nur ungefähr 250 MB werden benutzt während Programmlauf. Und der Prozess ist sehr langsam (dauert einige Tag!). Kann ich jergendwas tun dafür? :?: :?

Gruss
nov
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo,

Für den Fall, daß es sich um eine ernstgemeinte Frage handelt: Deine in Python geschriebenen Programme verwalten den Speicher dynamisch, d. h. Dein Programm nimmt sich den Speicher den es braucht. Und wenn Du noch genügend Speicherplatz frei hast und Dein Programm zu langsam ist, dann liegt es eben nicht daran, daß Dein Programm sich zu wenig Speicherplatz krallt - erst wenn Dein Programm das Betriebssystem zum "swappen" (d. h. zum Auslagern auf die Festplatte) zwingt, kann der Speicherplatz so richtig scharf limitierend sein.

Poste doch lieber mal etwas Code oder Pseudocode, um zu zeigen wo es tatsächlich hängt.

Gruß,
Christian
nov
User
Beiträge: 10
Registriert: Mittwoch 26. Juli 2006, 17:03

Hallo CM,

Vielen Dank für so schnell Antwort von Dir.

Mein Programm handelt sich um Datei-Transport zwischen zwei File. Eine davon ist alt und groß, die andere ist neu generiet und klein. Ich wähle die notwendige Information aus die Alte und kopiert sie zu der Neue.

Die Skript sieht so aus:

Code: Alles auswählen

from odbAccess import *
from abaqusConstants import *
import sys
#
# read command line and check parameters
argList = sys.argv 
argc=len(argList)
i = 0
requiredArgs = 1
while (i < argc):
    if (argList[i][:2]=="-s"):
        stepNumber = int(argList[i+1])
        requiredArgs +=2 
    elif (argList[i][:3]=="-od"):
        o1Name = argList[i+1]
        requiredArgs +=2 
    elif (argList[i][:3]=="-ou"):
        o2Name = argList[i+1]
        requiredArgs +=2 
    elif (argList[i][:2]=="-i"):
        frameNumber = int(argList[i+1])
        requiredArgs +=2 
    elif (argList[i][:2]=="-n"):
        newStepName = argList[i+1]
    elif (argList[i][:2]=="-h"):
        print ' '
        print ' '*15+'RDBS Usage:\n'+'-'*50+__doc__
        sys.exit(0)
    i+=1    

# open odbs
o1=openOdb(o1Name+'.odb')
o2=openOdb(o2Name+'.odb')
#

step_o1=o1.steps[o1.steps.keys()[stepNumber-1]]

frame_o1=step_o1.frames[frameNumber]
#
# create new step or use existing step
newDomain=step_o1.domain
newProcedure=step_o1.procedure

step_o2=o2.Step(name=stepName,description='new',domain=newDomain, 
    timePeriod=1.0, procedure=newProcedure)
#
# create new frame
frame_o2=step_o2.Frame(frameId = frameNumber, frameValue = frame_o1.frameValue,
    description = frame_o1.description)
#
# add data to new frame
for out in frame_o1.fieldOutputs.keys():
    field = frame_o1.fieldOutputs[out]
    #
    # search for conjugated data
    if out in ('U','UR'):
        newField = frame_o2.FieldOutput(name=out, description=field.description, 
            type=field.type, validInvariants=field.validInvariants, 
            componentLabels=field.componentLabels)

        for i in range(len(field.values)):
	    print i
            newField.addData(position=NODAL, instance=field.value[i].instance,
                labels=(field.value[i].nodeLabel,), data=(tuple(field.value[i].data),), 
                conjugateData=(tuple(field.value[i].conjugateData),))                      

# save and close odbs
o2.save()
o2.close()
o1.close()
Der Einzelnkommando verfügbar ist "field.addData(...)", und er erlaubt Knoten zu Knoten Kopie zwischen die zwei Datein. Die Größe von "len(field.values)" ist ungefähr 50,000. Durch "print i" sehe ich, dass die erste 2,000 Knoten sind sehr schnell kopiert (5 min), dann wird es immer langsamer werden. Während es ist die von Python benutzt Ram von 100 MB bis zu 200 MB gestiegen, aber nicht weiter. :?:

Was soll ich weiter machen?

Gruß
nov
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hm, muß noch ein wenig nachdenken und ich hoffe auch, daß Andere in die Diskussion einsteigen, da ich die von Dir verwendeten Module nicht kenne, aber einige Punkte fallen mir schon auf:

1. Du kennst das optparse-Modul?
2. Ist frame_o1.fieldOutputs ein dict? In dem Fall könntest Du auch mit iterkeys interieren oder, weil Du ja nur einmal auf out zugreifst mit itervalues, womit Du

Code: Alles auswählen

for field in frame_o1.fieldOutputs.itervalues():
schreiben könntest.
3. field.values ist eine Liste, oder? Warum dann so ein Konstrukt wie range(len(field.values)), wo i dann nachher gar nicht gebraucht wird, außer um als Index zum Referenzieren zu dienen? Du könntest direkt über die Liste iterieren, bzw. Generatoren bemühen.

HTH
Christian

PS Deutsch ist nicht Deine Muttersprache, oder?
edit: PPS import * ist kein guter Stil, weil es den Namespace füllt.
BlackJack

Wenn da hauptsächlich auf Dateien zugegriffen wird, dann wird die meiste Zeit mit dem Datentransfer von/zu der Festplatte verbracht. Wenn das Programm den Prozessor nicht auslastet, dann kann man da nicht viel machen, dann ist der Datentransfer der Flaschenhals.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ist natürlich auch ein Punkt, aber intuitiv vermute ich, daß ein Festplattenzugriff erst wieder in Zeile 68 stattfindet, oder?

Gruß,
Christian
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Also ich habe hier einige Python Programme laufen,
die sehr große Dateien ( > 3-5 GB, Firewall-Logfiles ) problemlos in Minuten durchackern und Aggregationsdateien schreiben, die immerhin
ca. 10 MB groß sind.

Auch habe ich dabei noch nie eine Beschränkung auf RAM gesehen;
die Programme, die bei meinem Arbeitgeber laufen, verbrauchen
vereinzelt > 2 GB RAM, da sollte kein Problem auftauchen.

Ganz allgemein kann ich nicht behaupten, das Python irgendwie langsam
wäre - ganz im Gegenteil.

Man müßte, um sowas beurteilen zu können, wissen wie die Dateien aussehen und was die Bibliotheken machen.
Antworten