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
Probelm in Ram...
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
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
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: 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
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()
Was soll ich weiter machen?
Gruß
nov
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 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.
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():
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.
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.
Hoi,
ist natürlich auch ein Punkt, aber intuitiv vermute ich, daß ein Festplattenzugriff erst wieder in Zeile 68 stattfindet, oder?
Gruß,
Christian
ist natürlich auch ein Punkt, aber intuitiv vermute ich, daß ein Festplattenzugriff erst wieder in Zeile 68 stattfindet, oder?
Gruß,
Christian
- 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.
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.