Laden...

Remoting Speicher bedarf

Erstellt von baumunk vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.126 Views
B
baumunk Themenstarter:in
28 Beiträge seit 2007
vor 16 Jahren
Remoting Speicher bedarf

Großes Problemm mit Remoting,

Ich habe mit einem Project angefangen, der daten aus DB auslist und als Structs zurückt gibt. Dabei steigt der Speicherbearf kontinuirlich hoch bei jeder abfrage.
Bei Client ist es jedoch konstant. Ich dachte erst das es an OleDBConnection liegt die nur einmal erstellt und geöfnett wird, die bei allen anfragen benutzt wird. Wenn ich bei jeder abfrage neue Connection aufbau ist es nur langsam.
Solange ich nur anfrage in DB simuliere bleibt Speicherbedarf konstant.

Woran kann der Steigende Speicherbedarf liegen?

1.274 Beiträge seit 2005
vor 16 Jahren

Schließt du auch wieder deine Datenquelle mit Dispose?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

B
baumunk Themenstarter:in
28 Beiträge seit 2007
vor 16 Jahren

Nein, tue ich nicht.

Habe ich aber ausprobiert, was Taskmanager anzeigt ist kaum unterschied.
In GC.GetTotalMemory schon, ist dann weniger.

Haupt problemm ist jedoch, dass es fast 5 fach langsamer ist,

S
489 Beiträge seit 2007
vor 16 Jahren

Von wieviel Speicher reden wir eigentlich? Bis zu gewissen Grenzen kann ein stetiger Anstieg normal sein.

B
baumunk Themenstarter:in
28 Beiträge seit 2007
vor 16 Jahren

Also anfang zeigt Taskmanager 25800
nach erste anfrage 32000
nach jede ca. 100 anfrage um je 2000.

Nach erste anfrage ist mir es so klar wird Remote object erstelt.
Warum danach es ansteigt verstehe es nicht.

Es geht auch nicht runter, wenn auch client geschossen wird.

Interesant ist was GC zurück gibt GC.GetTotalMemory (false) auf dem server.
Dieses wert ist von anfrage und danach so ca. gleich. versteht sich nach GC.Collect().

Was kann noch so viel speicher verbrauchen?

Nach ca 5000 anfragen ist speicherbedarf ca. 8 mal mehr !!

S
489 Beiträge seit 2007
vor 16 Jahren

Der GC gibt den Speicher nicht sofort wieder frei, sondern wann es ihm passt. Das könnte ein Grund sein. Wenn es aber mit Dispose ebenfalls nicht klappt, haste irgendwo ein Speicherleck. Ohne Code lässt hier wahrscheinlich kaum mehr sagen.

B
baumunk Themenstarter:in
28 Beiträge seit 2007
vor 16 Jahren

Hallo Sebostone,

also den Quellcode:

// Server seite

public BetData Read(Int32 QuelleID, UInt32 ID)
{
// nur auflistung von Connections die in Programm offen bleiben
OleDbConnection conn = server.Quellen.FindQuelle(QuelleID).Connection;
BetData res = SBetCommands.Select(conn, ID);
return res;
}

// Function SBetCommands.Select
public static BetData Select (OleDbConnection conn, UInt32 ID)
{

        StringBuilder sb = new StringBuilder();  
        sb.Append("Select TK, AdressTyp, Matchcode, Anrede, Titel, Vorname, Name1, ");  
        sb.Append("Name2, Name3, Sachbearbeiter, Briefanrede1, Briefanrede2, ");  
        sb.Append("Notizen1, Notizen2, Notizen3, Notizen4, Kennung, ");  
        sb.Append("CreateTime, CreateUser, ChangeTime, Changeuser ");  
        sb.Append("From S_BET Where ID = ?");  
        OleDbDataAdapter da = new OleDbDataAdapter(sb.ToString(), conn);  
        da.SelectCommand.Parameters.Add("ID", OleDbType.UnsignedInt, 4);  
        da.SelectCommand.Parameters[0].Value = ID;  
        DataSet ds = new DataSet();  
        da.Fill(ds);  
        da.Dispose();  
        DataTable dt = ds.Tables[0];  
        if (dt.Rows.Count == 1)  
        {  
            DataRow dr = dt.Rows[0];  
            BetData res = new BetData(dr, ID);  
            return res;  
        }  
        else  
        {  
            throw new BeteiligteNotExists(ID);  
        }  

          
    }  

// Struct BetData
[Serializable]
struct BetData
{
public UInt32 ID;
internal UInt16 TK;
public Int32 AdressTyp;

    public String Matchcode,   
        Titel,  
        Anrede,   
        Vorname,  
        Sachbearbeiter,  
        Kennung,  
        CreateUser,  
        ChangeUser;  

    public String Name1, Name2, Name3;  
    public String Briefanrede1, Briefanrede2;  
    public DateTime CreateTime, ChangeTime;  
    public String Notizen1, Notizen2, Notizen3, Notizen4;  
              
    public BetData(UInt32 ID)  
    {  
        this.ID = ID;  
        TK = 1;  
        AdressTyp = 0;  
        Matchcode = "";  
        Titel = "";  
        Anrede = "";  
        Vorname = "";  
        Sachbearbeiter = "";  
        Kennung = "";  
        CreateUser = "";  
        ChangeUser = "";  
        Name1 = "";  
        Name2 = "";  
        Name3 = "";  
        Briefanrede1 = "";  
        Briefanrede2 = "";  
        CreateTime = DateTime.Now;  
        ChangeTime = DateTime.Now;  
        Notizen1 = "";  
        Notizen2 = "";  
        Notizen3 = "";  
        Notizen4 = "";  
    }  

    public BetData(DataRow dr, UInt32 ID)  
    {  
        this.ID = ID;  
        TK = (UInt16)(int)dr["TK"];  
        AdressTyp = (Int32)dr["AdressTyp"];  
        Matchcode = (String)dr["Matchcode"];  
        Anrede = (String)dr["Anrede"];  
        Titel = (String)dr["Titel"];  
        Vorname = (String)dr["Vorname"];  
        Name1 = (String)dr["Name1"];  
        Name2 = (String)dr["Name2"];  
        Name3 = (String)dr["Name3"];  
        Sachbearbeiter = (String)dr["Sachbearbeiter"];  
        Briefanrede1 = (String)dr["Briefanrede1"];  
        Briefanrede2 = (String)dr["Briefanrede2"];  
        Notizen1 = (String)dr["Notizen1"];  
        Notizen2 = (String)dr["Notizen2"];  
        Notizen3 = (String)dr["Notizen3"];  
        Notizen4 = (String)dr["Notizen4"];  
        Kennung = (String)dr["Kennung"];  

        CreateTime = (DateTime)dr["CreateTime"];  
        CreateUser = (String)dr["CreateUser"];  
        ChangeTime = (DateTime)dr["ChangeTime"];  
        ChangeUser = (String)dr["ChangeUser"];  
    }  

}  

// Client
Da wird in schleife so ca. Daten ausgelesen:

mData = br.Read(mClient.QuelleID, ID);

Voraus Danke

6.862 Beiträge seit 2003
vor 16 Jahren

[Hinweis] Wie poste ich richtig? Punkt 6 bitte beachten.

Baka wa shinanakya naoranai.

Mein XING Profil.

B
baumunk Themenstarter:in
28 Beiträge seit 2007
vor 16 Jahren

An bei jetzt korrekt


// Server seite

public BetData Read(Int32 QuelleID, UInt32 ID)
{
// nur auflistung von Connections die in Programm offen bleiben
OleDbConnection conn = server.Quellen.FindQuelle(QuelleID).Connection;
BetData res = SBetCommands.Select(conn, ID);
return res;
}

// Function SBetCommands.Select
public static BetData Select (OleDbConnection conn, UInt32 ID)
{

StringBuilder sb = new StringBuilder();
sb.Append("Select TK, AdressTyp, Matchcode, Anrede, Titel, Vorname, Name1, ");
sb.Append("Name2, Name3, Sachbearbeiter, Briefanrede1, Briefanrede2, ");
sb.Append("Notizen1, Notizen2, Notizen3, Notizen4, Kennung, ");
sb.Append("CreateTime, CreateUser, ChangeTime, Changeuser ");
sb.Append("From S_BET Where ID = ?");
OleDbDataAdapter da = new OleDbDataAdapter(sb.ToString(), conn);
da.SelectCommand.Parameters.Add("ID", OleDbType.UnsignedInt, 4);
da.SelectCommand.Parameters[0].Value = ID;
DataSet ds = new DataSet();
da.Fill(ds);
da.Dispose();
DataTable dt = ds.Tables[0];
if (dt.Rows.Count == 1)
{
DataRow dr = dt.Rows[0];
BetData res = new BetData(dr, ID);
return res;
}
else
{
throw new BeteiligteNotExists(ID);
}


}

// Struct BetData
[Serializable]
struct BetData
{
public UInt32 ID;
internal UInt16 TK;
public Int32 AdressTyp;

public String Matchcode,
Titel,
Anrede,
Vorname,
Sachbearbeiter,
Kennung,
CreateUser,
ChangeUser;

public String Name1, Name2, Name3;
public String Briefanrede1, Briefanrede2;
public DateTime CreateTime, ChangeTime;
public String Notizen1, Notizen2, Notizen3, Notizen4;

public BetData(UInt32 ID)
{
this.ID = ID;
TK = 1;
AdressTyp = 0;
Matchcode = "";
Titel = "";
Anrede = "";
Vorname = "";
Sachbearbeiter = "";
Kennung = "";
CreateUser = "";
ChangeUser = "";
Name1 = "";
Name2 = "";
Name3 = "";
Briefanrede1 = "";
Briefanrede2 = "";
CreateTime = DateTime.Now;
ChangeTime = DateTime.Now;
Notizen1 = "";
Notizen2 = "";
Notizen3 = "";
Notizen4 = "";
}

public BetData(DataRow dr, UInt32 ID)
{
this.ID = ID;
TK = (UInt16)(int)dr["TK"];
AdressTyp = (Int32)dr["AdressTyp"];
Matchcode = (String)dr["Matchcode"];
Anrede = (String)dr["Anrede"];
Titel = (String)dr["Titel"];
Vorname = (String)dr["Vorname"];
Name1 = (String)dr["Name1"];
Name2 = (String)dr["Name2"];
Name3 = (String)dr["Name3"];
Sachbearbeiter = (String)dr["Sachbearbeiter"];
Briefanrede1 = (String)dr["Briefanrede1"];
Briefanrede2 = (String)dr["Briefanrede2"];
Notizen1 = (String)dr["Notizen1"];
Notizen2 = (String)dr["Notizen2"];
Notizen3 = (String)dr["Notizen3"];
Notizen4 = (String)dr["Notizen4"];
Kennung = (String)dr["Kennung"];

CreateTime = (DateTime)dr["CreateTime"];
CreateUser = (String)dr["CreateUser"];
ChangeTime = (DateTime)dr["ChangeTime"];
ChangeUser = (String)dr["ChangeUser"];
}

}




// Client
Da wird in schleife so ca. Daten ausgelesen:

mData = br.Read(mClient.QuelleID, ID);


Voraus Danke