Out of Memory aufgrund tiefer Kopie

hibit2k

Grünschnabel
Hallo,

ich habe folgendes Problem. Ich habe ein Objekt mit Hilfe der Serialize/Deserialize geklont um ein vollständiges Abbild zu bekommen.
Solange das geklonte Objekt klein ist funktioniert diese Funktion - wird das zu klonende Objekt größer so meldet das System mir einen "Out of Memory" Fehler.
Das Problem ist, ich weiß nicht wie groß das Objekt wird und wie ich diesen Fehler umgehen kann. Gibt es evtl. noch eine andere Möglichkeit?
Hier der Beispiel Code:

Public Function Clone(ByVal Obj As Object) As Object
Dim m As New IO.MemoryStream()
Dim b As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()

Try
b.Serialize(m, Obj)
m.Position = 0
Return b.Deserialize(m)
Catch
With Err()
MsgBox(.Description & " " & .Source.ToString, MsgBoxStyle.OkOnly)
End With
Return Nothing
End Try
End Function


Ich wäre froh, wenn mir irgendjmd. bei dem Problem helfen könnte, da ich noch nicht so viel Ahnung von VB.Net habe.

Danke
 
Hast du auch noch eine InnerException, oder zumindest einen Hinweis wo diese Exception geworfen wird? Vom BinaryFormatter, dem MemoryStream oder wer auch immer da schuldig ist?

Wäre auf jeden Fall hilfreich.
 
Hallo,

die vom System ausgegebene Meldung lautet:

"Eine Ausnahme vom Typ System.OutOfMemoryException wurde ausgelöst. mscorlib"

Daraufhin folgt:

"Die Objektvariable oder die With Blockvariable wurde nicht festgelegt.
Ausnahmetext:
System.nullReferenceException bei Microsoft.VisualBasic.Compilerservices.Symbols.Container..ctor(Object Instances)
Microsoft.VisualBasic.Compilerservices.NewLateBinding.LateGet(Object Instances)
...
"

Das komische ist, dass das Programm auf einem Rechner mit der gleichen Ausstattung läuft und auf einem anderen nicht.

Wenn dir noch weitere Fehlermeldungen helfen, kann ich auch dir auch noch ein Video davon schicken.

Grüße
 
Hi,
ich hab noch einmal nachgeguckt. Ich habe keine COM Komponenten verwendet und die Exception wird bei aufrufen von
m.serialize(m,obj)
rausgeschrieben.

Noch irgendwelche Ideen?

Grüße
hibit2k
 
Hallo,

ich habe noch einmal nachgeschaut. Wenn ich das Objekt anstatt mit einem "IO.Stream" in eine Datei umleite, so erreiche ich eine Objektgröße von 300MB(!) und das Serialisieren funktioniert. Das Deserialisieren in den Speicher natürlich nicht mehr.
Um die Objektgröße zu reduzieren hab ich dann die Datentypen der einzelnen Arrays geändert nur um mal zu gucken, in wie fern sich das auf die Objektgröße auswirkt.
Leider passiert rein gar nichts. Die Datei bleibt gleich groß, wenn ich von Double auf Single umsteige.

Die Arrays, die das Objekt beinhaltet, haben insgesamt 75000 Elemente vom Typ Single dynamisch belegt. Theoretisch, bei 4 Byte pro Element, komme ich auf einen Speicherbedarf von ca. 300kB. Wie kommt die Datei denn dann auf 300MB?
Was schreibt VB.Net sonst noch so raus in eine Datei?

Ich versuche auch noch einmal meine Objekthierarchie hier zu posten. Kann man auch irgendwie Bilddateien anhängen?

Viele Grüße
hibit2k
 
Zuletzt bearbeitet:
Zurück