Laden...

Forenbeiträge von basti81 Ingesamt 8 Beiträge

30.08.2011 - 10:14 Uhr

Hallo Leute,

ich habe hier ein nerviges Problem, und mir auch schon nach einer Lösung einen Wolf gesucht.
Zum Problem:
Jedes meiner C# Programme stürzt nach Aufruf von ShowDialog() ab, dabei ist es egal, ob bei OpenFileDialog, SaveFileDialog oder der FolderBrowserDialog.
Allerdings nur in der "x64" oder "Any CPU" Einstellung und nur mit der Framework 4.0, mit "x86" oder .Net 3.5 funktioniert der Aufruf tadellos.

Ach ja mein OS ist Windows 7 x64, ich habe auch schon zwei weitere Rechner mit 64 bit Betriebssystem probiert - mit dem selben Ergebnis.

Hier ist die Fehlermeldung:

Fehlermeldung:
vshost.exe funktioniert nicht mehr
Problemsignatur:
Problemereignisname: APPCRASH
Anwendungsname: test.vshost.exe
Anwendungsversion: 10.0.30319.1
Anwendungszeitstempel: 4ba2084b
Fehlermodulname: ntdll.dll
Fehlermodulversion: 6.1.7601.17514
Fehlermodulzeitstempel: 4ce7c8f9
Ausnahmecode: c0000008
Ausnahmeoffset: 00000000000512f7
Betriebsystemversion: 6.1.7601.2.1.0.256.48
Gebietsschema-ID: 1031
Zusatzinformation 1: 6915
Zusatzinformation 2: 6915d92b3250fd7a6692f2eb5b4f2fde
Zusatzinformation 3: dab5
Zusatzinformation 4: dab59319c30a164127a2dcdeffe3983d

Ich habe eigens ein kleines Testprojekt angelegt; mit nichts weiter als einer Winform mit einem Button und folgenden Button-Clickevent:


private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog save = new SaveFileDialog {Filter = "alles|*.*"};
            if (save.ShowDialog().Equals(DialogResult.OK))
            {
            }
        }

Vielleicht hat jemand schon einmal dieses Problem gehabt und kennt eine Lösung.

Neuinstallieren von VS 2010 und .net 4.0 brachte keine Änderung.

Schöne Grüße,
basti81

11.07.2011 - 19:41 Uhr

Bleibt die Erkenntnis, das alles seine Limitierung hat und nicht alles, was man Speichern/Serialisieren auch nachher noch laden kann.
Da werde ich dann ganz old-school meine eigenen Datenaustauschmethoden schreiben und die Werte in einer csv-Datei sichern, sind ja in diesem Fall nur strings und floats.

@JAck30lena: Es scheint aber nicht die Spaltenanzahl, sondern die Größe das Problem zu sein. Dieses Problem trat auch schon mal bei einer 100 x 6 Tabelle auf, da waren aber der Zellinhalt größer (längere strings).

11.07.2011 - 16:02 Uhr

Danke, aber WriteXmlSchema schreibt nur die Struktur ohne Daten!

Ich versuch mal:
.WriteXmlSchema(..)
.WriteXml(..)
...
.ReadXmlSchema(...)
.ReadXml(...)

ist zwar komplizierter und ich habe dann zwei Datei, aber ich probier es mal.

Leider funktioniert es auch so nicht!
Auch hier kommt beim Einlesen die Exception:

'Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in System.Xml.dll aufgetreten.'

Sonst noch Ideen zur Frage der Exception (System.StackOverflowException)?

11.07.2011 - 15:43 Uhr

Wie frage ist doch nicht warum ich die Daten haben möchte, sondern warum .Net gesicherte Werte nicht wieder herzustellen kann (im Speicher passen sie ja!).

Aber da du gefragst, will ich dir auch antworten:

Die Tabelle ist eine Document-Term-Matrix, d.h. eine Zeile stellt ein Dokument dar und die Spalten sind die gestemmten Wörter und die DataTable ist hier sehr bequem mit ihrer SELECT - Funktion.
Ich weiß für richtig viele Daten gibt es bessere Repräsentationsarten hierfür als eine Matrix, z.B. in Form einer Inverted Index Liste.

Aber für dieses Problem ist die Datenmenge sehr überschaubar.
Und das Deserialisierungsproblem ist mir schon häufiger begegnet (nicht nur bei DataTables), und hab nie eine Antwort gefunden.

Mit Write/ReadXml hast du teilweise recht, Hatte ich auch vorher benutzt. Ich habe aber den XmlSerializer verwendet, da für ReadXml die Tabellenstruktur der Zieltabelle schon bekannt seien muss (was nicht der Fall ist).

Bill Gates said we should never need more than 64K of RAM

11.07.2011 - 13:27 Uhr

Naja anlegen könnte ich das DataTable ja problemlos und die serialisierte Tabelle ist 1 GB groß.
Müßte also auch in den Speicher passen.

Sind auch glaube keine 20.000 Spalten, eher weniger, war nur eine Schätzung und viele Werte sind ja DBNull.

11.07.2011 - 11:24 Uhr

[DataTable] .WriteXmlSchema();

Okay danke, ich versuche mal meine Daten in kleinere Tabellen zu schreiben.

11.07.2011 - 11:11 Uhr

Danke für deine Antwort.

Das mit kleineren Tabellen wäre auch meine Notlösung gewesen, aber es wäre schon schön, wenn ich alles in einer Tabelle hätte.

Wie meinst du das mit, "erst in XML zu schreiben und dann selbiges zu Serialisieren"?

11.07.2011 - 10:52 Uhr

Hallo, ich lese zwar schon länger in diesem Forum mit, aber das hier mein erster Thread.
Ich hoffe ich habe alle Regeln befolgt 😃.

Zur meinem Problem:

Ich bekomme folgende Exception, wenn ich eine große DataTable (ca. 2000 x 20000 Zellen) versuchte von deserialisieren (egal ob mit BinaryFormatter oder XmlSerializer):

'Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in System.Xml.dll aufgetreten.'

Ich serialisiere das DataTable mit (im Falle des XmlSerializer):


public static void XMLSerialisieren<T>(T objekt, string path)
        {
            XmlSerializer mySerializer = new XmlSerializer(typeof(T));
            StreamWriter myWriter = new StreamWriter(path);
            mySerializer.Serialize(myWriter, objekt);
            myWriter.Close();
            myWriter.Dispose();
        }

und deserialisiere es mit :


public static void XMLDeserialisieren<T>(out T objekt, string path)
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            StreamReader sr = new StreamReader(path);
            objekt = (T)ser.Deserialize(sr);
            sr.Close();
            sr.Dispose();
        }

Am Speicher sollte es nicht liegen, ich hab 16GB (win7 x64).

Vielleicht kennt jemand eine Lösung.
Bei einschlägigen Suchmaschinen könnte ich keine Lösung finden!
Danke schonmal im Voraus.

verwendetes Datenbanksystem: <DataTable>