Hi!
erstmal ein herzliches hallo an alle, bin neu hier und kann mir vorstellen länger zu bleiben

eins vorweg, ich habe nie informatik studiert, darum möchte ich mich im voraus für unschönen code entschuldigen, ich übe noch...
vielleicht kann mir wer von euch weiter helfen, ich steh ziemlich an. ich versuche für eine 3d software (
www.rhino3d.com/) eine erweiterung für ein plugin (
www.grasshopper3d.com/) zu schreiben und scheitere vermutlich an einem speicherleck. meine erweiterung soll variablen aus grasshopper in eine eloquera datenbank schreiben und aus ihr auslesen. (
eloquera.com/)
aus irgend einem grund, läuft dabei der speicherverbrauch völlig aus dem ruder.
speicherverbrauch:
1 .... 1,61GB .... frisch hochgefahren
2 .... 1,87GB .... drei offene instanzen des programmes
3 .... 3,97GB .... alle scripts geladen und das erste mal ausgeführt
4 .... 4,59GB .... nach dem zweiten durchgang
5 .... 5,45GB .... nach dem dritten
6 .... 5,76GB .... nach dem vierten
7 .... 6,03GB .... nach dem fünften
8 .... 7,12GB .... nach dem neunten
9 .... 6,67GB .... nach dem zehnten
10 .... crash .... nach dem elften (8GB DDR2 sind verbaut, 20GB max ausglagerungsdatei wäre möglich)
dabei ist die wachstumsrate nicht konstant. am anfang ist sie höher und fällt dann auf ca 0,3GB je durchgang um kurz vor dem crash sogar den speicherverbrauch zu reduzieren.
der code um den es sich handelt besteht im grunde nur aus diesen zeilen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98:
| protected override void SolveInstance(IGH_DataAccess DA) {
List<Object> input = new List<Object>(); string groupname = null; bool overwrite = false;
if (((DA.GetData<string>(0, ref groupname) && DA.GetDataList<Object>(1, input)) && input.Count > 0) && groupname.Length > 0) { DA.GetData<bool>(2, ref overwrite); string statustext = null;
EDB_Entry placebo = new EDB_Entry(); placebo.Group = groupname; placebo.Data = null; placebo.Type = input[0].GetType().ToString(); placebo.OriginID = this.InstanceGuid.ToString();
GH_Eloquera.db.RegisterType(typeof(EDB_Entry));
string myid = null;
var ghDoc = this.OnPingDocument(); if (ghDoc != null) myid = ghDoc.FileNameProxy; if (myid.Contains("unnamed") == false) { EDB_Entry item = new EDB_Entry(); item.Group = groupname; item.Type = input[0].GetType().ToString(); item.OriginID = myid + "-" + this.InstanceGuid.ToString();
switch (item.Type) { case "Grasshopper.Kernel.Types.GH_Boolean": List<bool> inputBool = new List<bool>(); DA.GetDataList<bool>(1, inputBool); item.DataBool = inputBool; break; case "Grasshopper.Kernel.Types.GH_Integer": List<int> inputInt = new List<int>(); DA.GetDataList<int>(1, inputInt); item.DataInt = inputInt; break; case "Grasshopper.Kernel.Types.GH_Number": List<double> inputDouble = new List<double>(); DA.GetDataList<double>(1, inputDouble); item.DataDouble = inputDouble; break; case "Grasshopper.Kernel.Types.GH_String": List<string> inputString = new List<string>(); DA.GetDataList<string>(1, inputString); item.DataString = inputString; break; default: item.Data = input; break; }
if (!overwrite) { string querydel = "SELECT ONLY EDB_Entry WHERE Group = '" + groupname + "'"; var resdels = GH_Eloquera.db.ExecuteQuery(querydel); foreach (var resdel in resdels) { GH_Eloquera.db.Delete(resdel); } resdels = null; } else { string querytext = "SELECT ONLY EDB_Entry WHERE OriginID ='" + item.OriginID + "'"; var results = GH_Eloquera.db.ExecuteQuery(querytext); foreach (var result in results) { GH_Eloquera.db.Delete(result); } results = null; } GH_Eloquera.db.Store(item); statustext = "[" + input.Count.ToString() + "] items of type [" + input[0].GetType().ToString() + "] from component [" + item.OriginID + "] successfully written in database ["+ GH_Eloquera.dbName +"] group [" + groupname + "]."; DA.SetData(1, item.OriginID); DA.SetData(2, true);
item = null; placebo = null; input = null; groupname = null; myid = null; }else{ statustext = "error: cannot add correct ID without filename. please save file first."; } DA.SetData(0, statustext); statustext = null; } } |
ich habe im redgate profiler das 3dprorgamm mit allen geladenen plugins das beispiel rechnen lassen, und konnte kein speicherleck finden. kann es sein, dass es vom datenbankserver verursacht wird? die datei in der die datenbank liegt wächst (beispielbedingt) von 15MB im laufe der durchgänge auf 25MB. der server ist auf bis zu 1TB große datenbanken getestet, also halte ich das für eher unwahrscheinlich. eher glaub ich daran, irgend einen dummen anfängerfehler zu machen.
wär toll wenn ihr mir einen tipp geben könnten,
lg matthias
p.s. hier noch die klassendefinition:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| public class EDB_Entry { [Index] public string Group { get; set; } [Index] public string Type { get; set; } [Index] public string OriginID { get; set; } [Index] public List<object> Data { get; set; } [Index] public List<bool> DataBool { get; set; } [Index] public List<int> DataInt { get; set; } [Index] public List<double> DataDouble { get; set; } [Index] public List<string> DataString { get; set; } }
public static class GH_Eloquera { private static string mfilename = "empty123"; private static string mbakname = null; private static DB mdb = new DB(); private static System.Windows.Forms.Timer mytimer = new System.Windows.Forms.Timer();
public static System.Windows.Forms.Timer Timer { get { return mytimer; }
set { mytimer = value; } }
public static void addEvent(EventHandler ev) { GH_Eloquera.Timer.Tick += ev; }
public static void removeEvent(EventHandler ev) { GH_Eloquera.Timer.Tick -= ev; }
public static DB db { get { return mdb; }
set { mdb = value; } }
public static string dbName { get { return mfilename; } set { mfilename = value; } }
} |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt