Autor Beitrag
jg72
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: Di 10.05.11 09:27 
Hallo Zusammen,

ich habe eine Klasse, welche Daten aus einer Datenbank lädt. Sehr vereinfacht etwa so:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
class Item
{
   int m_nId;
   string m_sText;

   //...

   static Item Load(int nId)
   {
      Item item = new Item();
      // Werte laden
      return item;
   }
}


Nun sollen die einzelnen Items nur einmal im Speicher vorgehalten werden und nicht immer geladen werden:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//...
   static Item Load(int nId)
   {
      Item item = HoleSchonGeladenenItem(nId);

      if ( item == null )
      {
        Item item = new Item();
        // Werte laden
      }
      return item;
   }
//...


Ich habe nun noch keinen Ansatz, wie ich diese Funktion HoleSchonGeladenenItem schreiben soll (oder welchen anderen Mechanismus ich verwenden kann). Man könnte ja nun alle Einträge in einer SortedList (oder etwas vergleichbares) speichern, allerdings will ich nicht, dass die Einträge länger als nötig im Hautspeicher vorgehalten werden, man müsste also im schlimmsten Fall sowas wie eine Garbage-Collection durchführen. Nur wie stelle ich fest, ob das Objekt noch an anderer Stelle als in der Liste aktiv ist?

Es gibt da bestimmt schon etwas passendes, aber nur was?

Vielen Dank schonmal und viele Grüße,
Jürgen
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.05.11 11:41 
Hallo und willkommen,

speichere am besten die Werte (Items) anhand der Id in einem Dictionary<Key, Value>:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
static Dictionary<int, Item> items = new Dictionary(int, Item>(); // als Klassenmember

static Item Load(int nId)
{
  if(items.ContainsKey(nId))
  {
    return items[nId];
  }
  else
  {
    Item item = new Item();
      // Werte laden

    items.Add(nId, item); // zum Dictionary hinzufügen
    return item;
  }
}
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 10.05.11 11:48 
:welcome: in der EE!

Du willst also Objekte cachen, aber nur, solange sie von außerhalb noch referenziert werden? Das erledigt eine WeakHashtable (gibt es auch eingebaut, aber schlecht dokumentiert: msdn.microsoft.com/e...brary/dd287757.aspx).

@Th69: Das würde ja seiner SortedList ohne GC entsprechen.

_________________
>λ=
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.05.11 12:10 
Sorry, hatte den entscheidenden Satz wohl überlesen. :oops:

Als weitere Alternative könnte man eine WeakReference benutzen: msdn.microsoft.com/d...m.weakreference.aspx (s. besonders das Beispiel mit dem Dictionary)
jg72 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: Di 10.05.11 17:35 
Vielen Dank erstmal,

ich habe jetzt wohl ein bißchen was zum Lesen. Mal sehen, was ich davon verstehe

Viele Grüße,
Jürgen