2009-03-14 11 views
3

Ich habe eine große Anzahl von Objekten, die Baum sind wie Strukturen. Ich habe ein Problem, dass die Menge an Speicher, die die Anwendung verwendet, anfängt sich an> 1GB zu nähern, was bedeutet, dass die Leistung auf der Maschine abfällt und dass es nicht genügend Arbeitsspeicher gibt.Verwalten von großen Objekten in C#

Ich habe es geschafft, dies zu lösen, indem ich sqlite benutzte, um die Objekte zu Tabellen zu bringen und so effektiv die Daten zu verwalten, aber das ist keine mögliche Lösung mehr (aus Gründen werde ich hier nicht näher eingehen).

Welche Vorschläge haben Sie für die Verwaltung dieser Art der Sache haben? Ich habe keine (echte) Datenbanken zu verwenden, so denke ich, dass eine Lösung irgendwie wäre das SQLite-Prozedur mimick und eine Datei wieder Speicher verwenden - ist es etwas, das bereits in reiner dot net existiert oder ist es eine komplizierte Rolle Ihre eigenen Lage?

Antwort

7

Wenn Sie eine sehr große Anzahl von Objekten beginnen zu speichern, Objektzuordnung Overhead wird ein echtes Problem. Wenn .NET beispielsweise auf einem 32-Bit-System ausgeführt wird, erfordert das Zuordnen eines Objekts mindestens 16 Byte. Auf einem 64-Bit-System sprechen Sie mindestens 24 Byte pro Objekt. Wenn Ihre individuellen Objekte klein sind, ist dieser Zuordnungsaufwand ein hoher Preis.

Sie sagten, dass Sie eine haben „Baum wie Struktur.“ Ohne weitere Details zu Ihrer Anwendung kann ich nicht mit Sicherheit sagen, dass dies zutrifft, aber die meisten Baumstrukturen erfordern Zeiger auf Kindknoten und (manchmal) Zeiger zurück zu den Elternknoten. So nützlich wie Bäume sind, verursachen sie manchmal einen sehr hohen Aufwand. Es ist nicht ungewöhnlich, dass die Eltern- und Kindverknüpfungen 50% oder mehr des gesamten von Ihrer Struktur verwendeten Arbeitsspeichers benötigen.

In C# können Sie die Zuordnung Aufwand verringern, indem structs eher als Objekte zu verwenden, da structs haben im Wesentlichen keine Zuteilung Aufwand. Der Nachteil ist natürlich, dass Sie mit der manchmal sehr unpraktischen Werttyp-Semantik umgehen müssen.

Es ist möglich, auch viele Baumstrukturen in Arrays zu kollabieren, Kind und Eltern Links zu beseitigen und spart somit enorme Mengen an Speicher. Dies geht normalerweise auf Kosten von komplizierterem Code und einem Verlust der Laufzeit-Effizienz.

In meiner Arbeit habe ich regelmäßig sehr große Sammlungen (Hunderte von Millionen von Knoten) halten im Speicher.Wenn Sie 250 Millionen Datensätze im Speicher haben, benötigt jeder vier Byte in Ihrem Knoten ein weiteres Gigabyte RAM. Selbst bei einer 16-Gigabyte-Maschine erfordert die Pflege solcher Datenstrukturen sehr sorgfältige Überlegungen darüber, wie Speicher verwendet wird.

Wenn Sie das gesamte Ding im Speicher behalten müssen, dann würde ich vorschlagen, dass Sie Ihre Baumknoten Strukturen wenn möglich machen. Sie sollten auch alternative Möglichkeiten zum Speichern Ihrer Baumstruktur in Betracht ziehen, die explizite Links zu Eltern oder Kindern ausschließen. Ohne weitere Informationen zu Ihrer speziellen Anwendung kann ich keine spezifischeren Empfehlungen geben.

+0

in meinem Workflow habe ich einen neuen Schritt hinzugefügt, um die Daten in einem dynamisch definierten DataSet, und zwang den GC - soweit funktioniert es in Ordnung. Danke für Tipps/Hinweise! –

1

Ein paar offensichtliche Frage rechts der Wette: 1. Warum müssen Sie so große solche großen Baumstrukturen auf einmal speichern? 2. Woher kommen diese Daten überhaupt?

Was auch immer die Antwort, die Sie für diese Fragen haben könnten, stehen die Chancen, Sie müssen alle Daten im Speicher nicht speichern alle auf einmal. Behält größere Datenmengen auf der Festplatte und liest nur die Bits, die Sie gerade benötigen. Es sieht so aus, als ob es die Richtung ist, in die du sowieso gehst. Es gibt viele mögliche Orte in .NET, wo Sie neben RDMS Daten speichern könnten; Flachdatei, XML-Datei, isolierter Speicher usw. Oder könnten Sie das System haben, das Ihnen diese Daten zuführt (Frage 2), um sie jeweils kleineren Bits zu geben? Wenn Sie unbedingt große Baumstruktur im Speicher speichern müssen. Recherchiere irgendeinen Baumstrukturalgorithmus oder vielleicht sogar Datenkompression?

+0

Die Daten stammen aus einer unqueryable Datenquelle - es ist das gesamte Quellelement oder nichts. Die gesamte Struktur wird beibehalten, da die Endanzeige von der Anzahl der Ergebnisse im Baum abhängt. –

0

SQL Server Express ist frei.

+0

Ich kann dies auch nicht verwenden :( –

+0

Darf ich fragen, warum nicht? –

+0

Ich habe Einschränkungen für die Lösung von einem Drittanbieter festgelegt (meine Firma :)) –