Wie kann ich die Speicherprobleme von C# verringern

Goldman

Mitglied
Guten Morgen.
In Bezug auf die Speicherverwaltung, wollte ich mal fragen, ob man DLL's die mit using geladen wurden, auch wieder aus dem ram löchen bzw. entladen kann.

Denn ich habe ein Programm geschrieben, das nur 52 KB groß ist aber im RAM sage und schreibe 18 MB einnimmt.
Die DLL's sind:

System.dll (2 mal geladen, da 2 Forms)
System.Xml;
System.Data;
MySQLDriverCS;
System.Drawing;
System.Windows.Forms;

Die Dateien sind insgesamt ca. 8,09 MB groß.

Kann mir da einer Helfen
 
Das Programm wird im Speicher deswegen so groß, weil das .NET-Framework ja auch seinen Platz darin haben will, sobald man ein .NET-Programm startet. Ich würde mir darüber keine Sorgen machen, das ist normal und um den Speicher kümmert sich .NET selber. In der Regel killt die Gargabe Collection alle nicht mehr benötigten Objekte, man weiss halt nie so genau wann. Spätestens aber dann, wenn die Ressourcen knapp werden.
 
Hmmm GUt und schön, aber ich soll das Prog so klein wie möglich machen, da 50 User auf einmal(auf einem Server) darauf zugreifen und 1GB RAm Ca. 1000 € kostet was sich mein Betrieb net leisten kann.


Zum Hintergrund: Bei uns laufen 4 Metaframe Server jeder hat 50 User.
Metaframe ist arbeiten ohne Festplatte oder ähnliches.
Anmeldung erfolgt per Netzwerk die 50 User nutzen alle gemeinsam die Recourcen des Servers daher wird es schwer 50*18 MB dort noch unter zu bringen, wenn jeder Word offen hat.

Im übringen habe ich herrausgefunden, dass das Programm auf ca. 4-5 MB zusammenschrumpft, wenn man es minimiert.
Das wären trotzdem noch ca. 200 MB RAM für 50 User was einfach zuviel ist.

Gibts da nicht doch noch ne Möglichkeit das die Dateien nur einmal geladen werden
 
Und wie kann ich das machen ?
Die Leute müssen ja was zum Eingeben und zum Lesen haben.
 
Zuletzt bearbeitet:
Original geschrieben von Goldman
Hmmm GUt und schön, aber ich soll das Prog so klein wie möglich machen, da 50 User auf einmal(auf einem Server) darauf zugreifen und 1GB RAm Ca. 1000 € kostet was sich mein Betrieb net leisten kann.


Zum Hintergrund: Bei uns laufen 4 Metaframe Server jeder hat 50 User.
Metaframe ist arbeiten ohne Festplatte oder ähnliches.
Anmeldung erfolgt per Netzwerk die 50 User nutzen alle gemeinsam die Recourcen des Servers daher wird es schwer 50*18 MB dort noch unter zu bringen, wenn jeder Word offen hat.

Im übringen habe ich herrausgefunden, dass das Programm auf ca. 4-5 MB zusammenschrumpft, wenn man es minimiert.
Das wären trotzdem noch ca. 200 MB RAM für 50 User was einfach zuviel ist.

Gibts da nicht doch noch ne Möglichkeit das die Dateien nur einmal geladen werden

50 User?

Bietet einen Webservice an.
Oder im Java Bereich würde ich es mit Enterprise Java Beans versuchen.

Oder du programmierst es so, das jede Verbindung in einem seperaten Thread läuft.
 
Die 50 User connecten auf einen Server der ihnen dann windows simuliert.
Das Programm ist dann 50 mal im RAM was nicht so schlimm wäre, wenn es net so groß wäre(4-8 MB).

Wie kann das Prog als Service laufen lassen ?
Gibt es in C# übrigens eine Methode, mit der man herrausfinden kann, ob eine Form der Anwendung aktiv ist ?
 
Zuletzt bearbeitet:
Hi
ich habe so ein ähnliches problem. Mein Programm (50kb) will auch 17mb RAM haben. Die meisten Rechner wo es drauf laufen soll haben aber nur 64mb Ram und müssen dann noch größere Programme laufen lassen.
Mein Programm soll auch nur so im hintergrund laufen und Zeiten stoppen, hätte nich gedacht das das so viel speicher braucht.
Gibt es Regeln die man beachten kann um Speicher zu sparen? oder Tipps?

MfG Philipp
 
Naja, ähm ... folgendes:

Ob da jetzt irgendwas simuliert wird oder nicht ist ja egal. Fact is, dass das ganze eigentlich über Remoting laufen sollte. Jeder hat seinen Client und es gibt _einen_ Server der für jeden User einen Thread startet. Für jeden User eine Instanz zu starten ist purer Schwachsinn. Das heißt der Server liefert nur die Informationen und der Client rendert sich dann alles zusammen oder was halt auch immer passieren soll.

Ad Framework: Dieses muss geladen werden - ganz klar. So ist das .NET-Framework nun mal designed worden. Ist bei Java mit der VM auch net anders. Es wird jedoch alles nur _einmal_ geladen und nicht mehrfach, jedoch zu beachten, dass dies PRO Instanz gilt. Daher, eine Instanz und Threads verwenden.

Für kleinere Geschichten gibts immer noch die Embedded-Geschichte.

Ad Christian:
Ich denke, wenn er es schon in C# hat, ist der Anreiz und die Sinnhaftigkeit auf Java umzusteigen sinnlos.
 
Also mit dem Threading habe ich da schon was allerdings weiß ich nicht, wie ich das auf mein programm übertragen soll.
Jeder nutzer Soll beide Formulare sehen können und Ein-/Ausgaben haben.
Kann mir da einer weiter helfen

@ kleiner_mann machs so wie ich und minimiere das Formular einfach.. ^^



Code:
public void MemoryRecovery()
{
	Formular2.WindowState = FormWindowState.Minimized;

	WindowState = FormWindowState.Minimized;

	Formular2.WindowState = FormWindowState.Normal;

	WindowState = FormWindowState.Normal;

	MessageBox.Show("Code powered by Goldman");
}

so müsste es funktionnieren. musst das natürlich anpassen.
je nachdem wieviel Formulare du hast. Statt Formular2 schreibste halt den Namen deiner zweiten form odcer wenn du nur eine form hast, kannste das mit Formular2 weglassen.
 
Zuletzt bearbeitet:
Zurück