2009-04-15 6 views
2

Ich habe das Gefühl, dass ich ziemlich viele Daten in meine ASP.NET-Sitzung gebe, aber ich habe keine Ahnung, wie viel und ob ich besorgt sein sollte. Ich habe eine similar question gefunden, aber das beruht auf der Serialisierung von Objekten und der Überprüfung ihrer serialisierten Größe. In meinem Fall befinden sich die meisten Daten in der Sitzung in Objekten einer anderen Bibliothek, deren Klassen nicht als "Serialisierbar" markiert sind. (Ich weiß, dass dies mich einschränkt, den InProc-Sitzungsstatusanbieter zu verwenden, aber das ist ein anderes Problem). Hat jemand eine Idee, wie man den Objektgraphen durchläuft und seine Größe ermittelt?Wie wird die Größe der ASP.NET-Sitzung ermittelt, wenn nicht serialisierbare Objekte darin enthalten sind?

Hinzugefügt: OK, eine Möglichkeit wäre eine manuelle Traversierung des Objektdiagramms und die Verwendung der Marshal.SizeOf() -Methode. Aber das ist eine Menge Schreiben, um das zu erreichen. Gibt es vielleicht einen einfacheren Weg, den gleichen Effekt zu erzielen? Ich bin nicht für Byte Präzision Ziel, ich bin interessiert in der Größenordnung (Kilobyte, Megabyte zig Megabyte ...)

Antwort

-1

Sie wahrscheinlich die Sitzungsstatusinformationen in der Datenbank speichern können und überprüfen Sie die Größe, aber ich bin mir nicht sicher, ob es da draußen ein Werkzeug gibt, mit dem man das Objektdiagramm sehen und durchqueren kann.

Wenn möglich, überprüfen Sie Ihren Entwurf noch einmal, um festzustellen, ob Sie die Informationen in der Sitzung minimieren können.

+0

Vorsichtig lesen! Irgendwo dort, in Kleingedruckten geschrieben, gibt es ein paar Worte über "nicht serialisierbare Objekte". Ich kann es nicht in einen Byte-Stream konvertieren, geschweige denn in einen DB! –

+0

Und was Speicheroptimierungen betrifft - der Code ist schon so minimalistisch, wie ich es ohne "tricky, clevere Optimierungstricks" machen könnte. Ich könnte es vielleicht noch mehr quetschen, aber das würde eine große Anstrengung bedeuten. Ich möchte herausfinden, ob es das wert ist. –

+0

Hallo Vilx, kannst du mir mehr Informationen über nicht serialisierbare Objekte geben? –

1

Zum Testen könnten Sie einen Stub-Custom-Session-Provider erstellen, der die abstrakte SessionDateStoreProviderBase-Klasse implementiert. Ich würde Backing-Felder schreiben, die alles in WebCache speichern (damit Sitzungsdaten verwaltet werden) und schließlich eine Statistik mit der Marshal.SizeOf() -Methode generieren, wenn die SetAndReleaseItemExclusive-Methode aufgerufen wird.

 public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) 
     { 

     double MemSize = 0; 
     foreach (object sessObj in item.Items) 
     { 
      MemSize += Marshal.SizeOf(sessObj); 
     } 

} 

Consult diese Frage für weitere Informationen zu Feldgröße bekommen: Getting the size of a field in bytes with C#

+0

http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx - "Diese Methode akzeptiert eine Instanz einer Struktur, die ein Referenztyp oder ein Boxed-Werttyp sein kann. Das Layout muss sequenziell oder explizit sein . " – meandmycode

+0

Gibt mir das nicht nur die Größe eines Objekts, nicht die ganze Grafik? Das Problem ist, ich setze keine einfachen Objekte in die Sitzung. Dort befinden sich ganze DataTables (bzw. von DataTable abgeleitete Klassen). Und ein Element kann unter mehreren Schlüsseln in der Sitzung gefunden werden. –

+0

Richtig, Sie müssen Ihr Objektdiagramm durchlaufen, um die Größe eines Objekts genau zu berechnen, da Sie nicht serialisieren können. Dafür müssen Sie einige rekursive Reflektionsarbeiten durchführen. Dies bringt Ihnen eine Analyse der Sitzungsgröße außerhalb einer Seitenstruktur –

1

können Sie keinen Heapdump erzeugen und die Größe der Sitzung von dem finden. in java land kann ich den haufen dump dann öffne es in mat, finde das sitzungsobjekt und finde die größe des teilgraphen.

+0

Nicht ohne 3rd-Party-Tools kann ich nicht ... Aber es ist eine Idee. Ich habe ".NET Memory Profiler" zuvor verwendet, und es war gut. Vielleicht könnte es auch in diesem Fall helfen. –

Verwandte Themen