2009-03-09 3 views
1

Ich habe eine .NET2 C# -Web-App. Es hat eine variable Anzahl von großen, init-teuren Objekten, die über mehrere Anfragen verteilt sind, aber keinem bestimmten Benutzer zugewiesen sind. Ich muss sie daher in einer Lookup-Struktur beibehalten. Diese Objekte müssen nach Bedarf erstellt werden und sind nicht für die Lebensdauer der App erforderlich, sondern nur für die Nutzungsdauer.großer Objekt-Cache

Plus ein bisschen.

Die Speicherleckweise, dies zu tun, ist ein einfaches Wörterbuch, die Speicher-sichere Möglichkeit, dies zu tun, ist ein schwach referenziertes Wörterbuch, aber das Problem ist, dass der GC einfach zu verdammt schnell ist. Realistisch gesehen ist das vielleicht kein Problem, denn der Verkehr zu den Objekten sollte so sein, dass sie am Leben bleiben, ohne dass sie sich zu viel regenerieren müssen, aber idealerweise möchte ich, dass sie auch verkleinert werden.

Gibt es eine Art Mittelweglösung, über die ich die Objekte nicht für einen bestimmten Zeitraum sicher vor dem GC verstecke, sondern auch, dass sie am Ende dieser Zeit gesammelt werden können, vorzugsweise, wo dieser Zeitzähler jedes Mal zurückgesetzt wird, wenn sie ähnlich wie Session-Token verwendet werden?

Antwort

5

warum die HttpRuntime cache hier nicht funktionieren würde, Gegenstände in den Cache eingefügt wird „erneuert“ werden jedes Mal, wenn sie berührt werden Dadurch bleiben sie am Leben, bis sie nicht mehr gebraucht werden, und danach bleiben sie im Cache, bis sie ablaufen (Gleit- oder Rollzeit), oder sie werden durch den Erinnerungsdruck herausgedrängt und können auch explizit herausgedrückt werden -set, absolute Zeit unabhängig von der Verwendung:

  • Absolute Zeit: Einzelteile nach dem Systemtakt gezwungen werden gibt eine bestimmte Datetime

  • Sliding (Rollen) Zeit: Jedes Mal, wenn ein Element berührt wird, zurückgesetzt wird der Countdown bis zum Tod. Die Dauer des Countdowns ist die Schiebezeit (z. B. 5 Minuten).

Beispiel Nutzung:

//adds itemObject to cache under name "UniqueItemKey" 
//set to expire 5 minutes after last touched 
HttpRuntime.Cache.Add("UniqueItemKey", 
         itemObject, 
         null, 
         Cache.NoAbsoluteExpiration, 
         new TimeSpan(0, 5, 0), 
         CacheItemPriority.Normal, 
         null); 
+0

Genau was das OP braucht, glaube ich. – configurator

+0

bang on - jetzt habe ich nur das Problem zu spähen ohne zu berühren, aber das ist für eine andere Frage ... – annakata

1

Warum verwenden Sie nicht das Cache-Objekt aus dem Framework und legen Sie ein gleitendes Ablaufdatum darauf fest. Sagen Sie 10 Minuten. Wenn es mindestens einmal alle 10 Minuten benutzt wird, bleibt es im Cache, wenn die 10 Minuten verstreichen, wird es verfallen und GC wird es entfernen.

Ein Beispiel:. (Ich glaube, das die vollständige Syntax Ich bin nicht sicher ist

Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High) 
0

Es klingt wie Sie bereits eine Lösung für Ihr eigenes Problem beschreibt; eine Art Cache-Struktur, die für eine gewisse Zeit starke Referenzen enthält, diese aber dann auf schwache Referenzen herabstuft, wenn einige Zeit vergeht, ohne dass auf das Objekt "zugegriffen" wird.

+0

die Herabstufung ist der Trick aber ... – annakata

0

Der entscheidende Teil ist "die Lebensdauer ihrer Nutzung." Wie definierst du das? Wenn Sie es genau so definieren können, dass Sie kein Wissen über die Zukunft benötigen, ist der Rest wahrscheinlich einfach.