So ich geh jetzt erstmal ins Wochenende. Heute konnte ich mich leider garnicht mit dem Problem beschäftigen.
Die weiteren Vorschläge sind sicher gut und so wies ausschaut wird mir nichts weiter übrig bleiben, als die Daten zwischenzuspeichern. Was allerdings vermutlich schon zeitkritisch ist, da ich hinterher bei der Auswertung vielfach "sequentiell" die Array-Informationen brauche.
Ärgerlich ist natürlich, dass ich jetzt hier vier GB Speicher durchgeboxt habe und es nur "relativ" wenig Zusatznutzen bringt.
Da ich jetzt keine weiteren Ideen mehr erhalten habe, könnte es durchaus sein, dass es an einer prinzipiellen .net Beschränkung liegt.
Habe nun in einem Windows XP Forum die Frage platziert. Die zwei GB Grenze existiert so und vermutlich kriege ich nur knapp über einen GB, weil es ja noch diesen Puffer gibt.
Prinzipiell sollte es auch ausreichen die Veränderungen der Boot.Ini durchzuführen um die 3GB Option zu aktivieren. Nur leider hat das hier bisher nicht zum Erfolg geführt.
Ein weiterer Hinweis dort war, dass man was an den Compileroptionen ändern müsste:
"Eine 32-bittige App kann
- unter 32bittigem Win mit /3GB Switch bis zu 3GB allozieren
- unter 64bittigem Win bis zu 4GB allozieren
wenn gleichzeitig das LARGEADDRESSAWARE Flag bei dieser App
(Linker-Switch) gesetzt ist. "
Dann war da noch die Rede, dass es auch ein wenig davon abhängt wie groß die Happen sind, die man jeweil alloziiert.
Meine Frage ist nun wie ich in Visual Studio Linker bzw. Compiler Optionen setzten kann. Vielleicht ist das ja tatsächlich momentan noch mein Problem.
Über die Variante mit der manuellen Zwischenspeicherung denke ich momentan auch ernsthaft nach (auch wenn ichs lieber vermeiden möchte). Allerdings möchte ich jetzt (wo ich schon einiges an Zeit reingesteckt habe) auch das Problem mit der 3GB Grenze gelöst kriegen.
Habe jetzt schon einige Male von dieser "magischen" 2 GB Grenze gelesen. Bei mir steigt das Programm (laut Task Manager) allerdings schon bei knapp über einen GB aus. 2GB würde mir auch schon sehr helfen.
Wie könnte man vorgehen um rauszufinden, warum er bei mir schon bei 1GB aussteigt? Ideen?
Werde auf jeden Fall den SysAd jetzt erstmal schreiben, dass es noch nicht funktioniert und mal sehen, ob er noch Ideen hat.
OK, einer der SysAds hier hat mir eben mitgeteilt, dass er die (auf den entsprechenden Links beschriebenen) Änderungen in der Boot.Ini Datei durchgeführt hat.
Habe also meinen Rechner runtergefahren, neugestartet und es nochmal ausprobiert. Leider hat sich an der Situation nichts geändert. Kriege immer noch diese OutofMemoryException.
Vermute daher, dass man zusätzlich in Visual Studio bestimmte Veränderungen durchführen muss. Irgendjemand eine Idee was ich an den SysAd weiterleiten könnte?
@herbivore: Bei mir bietet mir Google ein Samsung Notebook mit 3 GB Festplatte an erster Stelle an;-) Kannst du mir evt. den genauen Link schicken?
Habe jedenfalls jetzt so ein paar Infos gefunden. Wenn ich das richtig verstehe, muss ich kleine Änderungen in der Boot.Ini Datei durchführen (wofür ich sicherlich Adminrechte brauche, oder? ). Ist es damit dann getan oder muss ich speziell in der Visual Studio Umgebung noch Einstellungen ändern?
Weiß hier jemand wie ich die Speicherbegrenzung auf 3GB hochsetzen kann?
Was sind Memory mapped Files? Das "Monsterarray" wird im Verlauf einer Simulation gefüllt. Daher ist die Sache auch "zeitkritisch". Wenn Memory mapped Files die Daten immer wieder von der Festplatte lesen müssen, wird mir wahrscheinlich nicht geholfen sein,-)
Habe eben die Programmausführung im Task Manager beobachtet. Beim Start des Programmes liegt die Speicherbelastung bei ca. 150MByte. Dann wird sukzessive das Array gefüllt und der Speicherbedarf steigt stetig auf ziemlich genau ein Gigabyte. Scheinbar reserviert das Programm nur genau diesen einen Gigabyte.
Wenn ich nun in der Systemleistung nachschaue, wird mir ein noch verfügbarer Speicher von fast zwei Gigabyte angezeigt.
Ist das hier eine generelle C# Beschränkung (zB wegen Garbage Collector oder ähnlichem) oder kann man die Speicherreservierung manuell erhöhen?
ich habe ein dreidimensinales long Array mit folgender Dimensionierung addressiert:
x = variabel
y = 47
z = 10
Hatte bis gestern 1024 MByte Arbeitsspeicher und habe damit x auf ca. 150000 setzten können. Danach kam eine Out of Memory Meldung.
Soweit so gut. Seit heute habe ich vier Gigabyte Arbeitsspeicher. Die Fehlermeldung kommt nun bei knapp über x = 200000. Das enttäuscht und verwirrt mich irgendwie. Wenn ich mit 4 Byte pro long Eintrag rechne, komme ich bei x=250000 zu einem Speicherbedarf von ca. 450 MByte. Da sollte doch bei vier Gig Arbeitsspeicher deutlich mehr drin sein. Oder hat C# interne Beschränkungen?
Gibt es in C# eine elegante Möglichkeit ein Array zu Redimensionieren unter Beibehaltung der bisherigen Inhalte? Quasi das, was man in VB durch:
Redim Preserve Array
wie kann ich in einem ZedGraph die Achsenintervalle selbst definieren? Die Methode AxisChange funktioniert prinzipiell gut nur ist si völlig "nutzlos", wenn der Graph einige Ausreißer enthält. Man sieht dann das wesentliche leider nicht mehr.
Habe mir bisher damit geholfen, dass ich die Ausreißer gestutzt habe. Auf Dauer ist das aber eine eher unpraktische Methode.
Hab jetzt nochmal genauer gekuckt.
Du hast recht! Ich hab da einen Fehler gemacht und immer aus dem Verzeichnis obj gestartet. Dort war sie nicht drinn.
Was ist denn der Unterschied zwischen Obj und Bin?
gibt es in VS die Möglichkeit zur Versionierung? Oder wie kann ich ein Projekt "sicherheitkopieren", um den Status Quo zu sichern und dann unbeschwert am Code herumzubasteln?
Bisher hab ich mir damit beholfen, dass ich das komplette Verzeichnis kopiert habe. Das ist natürlich eher weniger schön. Unter Datei kann ich ja immer nur einzelne Programmteile speichern und nicht das komplette Projekt.
Klingt alles sehr gut. Nur steht die lokale Kopie schon auf True. Hab sie jetzt mal auf false und wieder zurück auf true gesetzt ohne Veränderung. Keine Ahnung warum das nicht geht.
Hab im Anschluss die DLL einfach ins Startverzeichnis kopiert und jetzt funkzt!-)
Ja du hast recht. Wenn ich mir die Sache anschaue bevor ich die erste Message Box anklicke gibt es tatsächlich noch einen weiteren Prozess. Dieser verschwindet aber sobald ich die Box wegklicke.
Habe nun an der Stelle, wo die Box angezeigt wird den Debugger gestartet und tatsächlich tritt in der Zeile:
public Form1()
{
InitializeComponent(); <--- Fehlermeldung
}
ein Fehler auf. Dieser wird mir allerdings außerhalb des Debug Modus nicht angezeigt. Die Fehlermeldung läßt stark vermuten, dass es was mit der ZedGraph dll zu tun hat:
System.IO.FileNotFoundException wurde nicht behandelt.
Message="Die Datei oder Assembly ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60 oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden."
Source="CrisCon_Light"
FileName="ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60"
FusionLog="=== Zustandsinformationen vor Bindung ===\r\nLOG: Benutzer = IKB\\s210991\r\nLOG: DisplayName = ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60\n (Fully-specified)\r\nLOG: Appbase = file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/\r\nLOG: Ursprünglicher PrivatePath = NULL\r\nAufruf von Assembly : CrisCon_Light, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.\r\n===\r\nLOG: Diese Bindung startet im default-Load-Kontext.\r\nLOG: Es wurde keine Anwendungskonfigurationsdatei gefunden.\r\nLOG: Die Computerkonfigurationsdatei von C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\config\\machine.config wird verwendet.\r\nLOG: Verweis nach der Richtlinie: ZedGraph, Version=5.0.1.41097, Culture=neutral, PublicKeyToken=02a83cbd123fcd60\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph.DLL.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph/ZedGraph.DLL.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph.EXE.\r\nLOG: Download von neuem URL file:///X:/Visual C#/Projects/CrisCon_Light/CrisCon_Light/obj/Debug/ZedGraph/ZedGraph.EXE.\r\n"
StackTrace:
bei CrisCon_Light.Form1.InitializeComponent()
bei CrisCon_Light.Form1..ctor() in X:\Visual C#\Projects\CrisCon_Light\CrisCon_Light\Form1.cs:Zeile 17.
bei CrisCon_Light.Program.Main() in X:\Visual C#\Projects\CrisCon_Light\CrisCon_Light\Program.cs:Zeile 34.
Anfangen kann ich damit nicht viel. Aber ich vermute, dass die Problemlösung nun nicht mehr weit ist.
Wie gesagt aus VS heraus funkzt problemlos.
Hört sich nach einer guten Idee an, aber es funktioniert nicht. Der Prozess hat den Namen: Programmname.vshost.exe und wenn ich den befehl "an Prozess anhängen" auswähle, dann kann ich diesen nicht "auswählen". Er steht zwar in der Liste, allerdings in grauer Schrift und der Typ ist "verwaltet". Alle anderen Prozesse haben hingegen den Typ x86.
Vermute mal stark, dass das was mit meinem Problem zu tun hat... nur was?
Ok hab jetzt eine zweite Message Box in die Prozedur FormLoad eingebaut. Starte ich von VS bekomme ich beide Message Boxen und danach geht dir Form auf.
Starte ich aus dem Explorer kommt nur eine Message Box. Die zweite erscheint nicht mehr und die Form geht auch net auf. Ein Prozess mit dem namen ist aber im Task Manager zu sehen.
Was kann ich jetzt noch machen, um den Fehler zu beheben?
Also der Prozess läuft im Task Manager. Hab das mit der Messagebox ausprobiert. Diese wird angezeigt. Mein Hauptprogramm sieht wie folgt aus:
static void Main()
{
Init();
MessageBox.Show(" Dies ist ein test");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Die Messagebox kommt noch. Die Form wird dann aber nicht mehr angezeigt. Starte ich aus VS wird die Form anstandslos angezeigt.
Kann das was mit dem ZedGraph zu tun haben? Wär jetzt schon ein bisl aufwendig, den zum Testen wieder rauszunehmen. Außerdem will ich den natürlich auch behalten.
mein Programm startet nicht, wenn ich es aus dem Explorer heraus aufrufe. Man sieht nur kurz eine Sanduhr und dann passiert nichts mehr (sowohl im Debug als auch im Release Ordner).
Heute vormittag ging es noch problemlos. Momentan kann ich es nur noch über die Visual Studio Opberfläche aufrufen. Dann geht die Form problemlos auf und das Programm funktioniert tadellos.
Seid heute morgen habe ich ein ZedGraph Control hinzugefügt und die ContextSwitchDeadlock Ausnahme ausgeschaltet.
ich kriege hier folgende seltsame Fehlermeldung:
ContextSwitchDeadlock wurde erkannt.
Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x1b0578 zum COM-Kontext 0x1b06e8 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.
Meine Programmstruktur:
Zunächst öffne ich eine Form. In dieser kann man verschiedene Parameter eingeben. Durch drücken des Button Starts beginnt eine Simulation. Nach ca. 60 Sekunden bricht das Programm ab und liefert obigen Fehler. Als (Ex-)VBAer kann ich damit leider absolut garnix anfangen.
Wie kann ich diesen Fehler vermeiden? Vielen Dank für Infos.
wie kann man in C# Diagramme bzw. Graphen zeichnen. Perfekt wäre eine Funktion der ein Array aus x,y-Werten übergeben wird und die dann den passenden Graphen in eine Form zeichnet.
Verstehe leider adhoc nicht recht was da steht. Ich will ja garnicht, dass zwei Forms miteinander kommunizieren, sondern nur auf das eine Haupform zugreifen können. Als Hauptform deklariere ich ja Oberfläche und es scheint mir ganz natürlich, dass ich über Oberfläche.xxx auf die Controls zugreifen könnte. Aber das funktioniert leider nicht. Was genau mach ich den da falsch?
Sry für meine sicher wenig qualifizierten Fragen, aber ein kurzes Codebeispiel würde mir sehr helfen.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void B_DatenEinlesen_Click(object sender, EventArgs e)
{
int cIndex;
for (cIndex=1; cIndex≤100;cIndex++)
PB_Fortschrittsbalken. = cIndex; <---- hier kann ich problemlos auf das Obekt zugreifen
Program.DatenLeseObject.KundenTabelleVerbinden();
Program.Cholesky_Init();
}
und hier das Programm:
static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Init();
Form1 Oberfläche = new Form1();
Oberfläche. <---- hier kennt er den PB_Fortschrittsbalken leider nicht
Form1. <------ so kennt er in leider auch nicht
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(Oberfläche);
}
Es muss doch möglich sein aus dem Hauptprogramm aus auf die Controls zuzugreifen ohne alle Controls einzeln zu übergeben.
@Borg: Also ehrlich gesagt kommt in meiner Form Klasse das Objekt PB_Fortschrittsbalken garnicht vor. Ich habe es nur im Entwickler in die Form eingebaut und kann in der Form Klasse auch darauf zugreifen. Außerhalb der Form Klasse kann ich leider nicht darauf zugreifen.
@thejudge: Daran hatte ich auch schon gedacht das Controll zu übergeben, aber da ich im hauptprogramm auf eine Vielzahl von Controls zugreifen muss, müsste ich ja jedes einzeln übergeben. Das kann doch sicher nicht der einzige Weg sein.
In VB zB konnte ich eig. immer ganz problemlos von überall auf meine Controlls zugreifen.
kann mir jemand von euch ein gutes C# Buch empfehlen. Habe hier den dicken Schincken von Andreas Kühnel liegen und merke leider immer mehr, dass ich mit seinem Schreibstil nicht immer gut klarkomme.
Das Visual Basic Buch von Koffler hat mir sehr gut gefallen. Es gibt wohl auch ein C# Buch andem Koffler Teile mitgeschrieben hat. Ist das zu empfehlen?