4 Stimmen

Speicherverwaltung in C#

Guten Tag,

Ich habe einige Textdateien mit einer Liste von (2-Gramm, Anzahl) Paaren, die durch die Analyse eines Korpus von Zeitungsartikeln gesammelt wurden und die ich in den Speicher laden muss, wenn ich eine bestimmte Anwendung, die ich entwickle, starte. Um diese Paare zu speichern, verwende ich eine Struktur wie die folgende:

private static Dictionary<String, Int64>[] ListaDigramas = new Dictionary<String, Int64>[27];

Die Idee, ein Array von Wörterbüchern zu haben, ist auf Effizienzfragen zurückzuführen, da ich irgendwo gelesen habe, dass ein langes Wörterbuch einen negativen Einfluss auf die Leistung hat. Davon abgesehen wird jedes 2-Gramm in das Wörterbuch aufgenommen, das dem ASCII-Code des ersten Zeichens minus 97 entspricht (oder 26, wenn das erste Zeichen kein Zeichen im Bereich von "a" bis "z" ist).

Wenn ich die (2-Gramm-, Zähl-)Paare in den Speicher lade, nimmt die Anwendung insgesamt 800 MB RAM in Anspruch, und das bleibt so, bis ich ein Programm namens Memory Cleaner verwende, um Speicher freizugeben. Danach sinkt der Speicherbedarf des Programms auf 7 MB bis 100 MB, ohne dass die Funktionalität beeinträchtigt wird (glaube ich).

Gibt es eine Möglichkeit, auf diese Weise Speicher freizugeben, ohne eine externe Anwendung zu verwenden? Ich habe versucht, Folgendes zu verwenden GC.Collect() aber in diesem Fall funktioniert es nicht.

Ich danke Ihnen vielmals.

8voto

Darin Dimitrov Punkte 990883

Sie verwenden ein statisches Feld, so dass die Chancen stehen, dass es, sobald es geladen ist, nie Garbage Collect bekommt, es sei denn, Sie rufen die .Clear() Methode auf dieses Wörterbuch anwenden, wird es wahrscheinlich nicht der Garbage Collection unterliegen.

4voto

Hans Passant Punkte 894572

Es ist mir ziemlich rätselhaft, wie es derartige Dienstprogramme überhaupt auf den Rechner eines Menschen schaffen. Alles, was sie tun, ist EmptyWorkingSet() aufzurufen. Vielleicht sieht es in Taskmgr.exe gut aus, aber ansonsten ist es nur eine Möglichkeit, die Festplatte unnötig zu beschäftigen. Genau das Gleiche erreichen Sie, wenn Sie das Hauptfenster Ihrer Anwendung minimieren.

3voto

siride Punkte 184124

Ich kenne die Details der Funktionsweise von Memory Cleaner nicht, aber da es unwahrscheinlich ist, dass er das Innenleben der Speicherzuweisungen eines Programms kennt, ist das Beste, was er wahrscheinlich tun kann, einfach nur, dass Seiten auf die Festplatte ausgelagert werden, was den offensichtlichen Speicherverbrauch des Programms reduziert.

Die Garbage Collection hilft nicht, es sei denn, Sie haben tatsächlich Objekte, die Sie nicht mehr verwenden. Wenn Sie Ihre Wörterbücher verwenden, was der GC als gegeben ansieht, da es sich um ein statisches Feld handelt, dann werden alle darin enthaltenen Objekte als in Gebrauch betrachtet und müssen zum aktiven Speicher des Programms gehören. Es gibt keine Möglichkeit, dies zu umgehen.

1voto

Pieter van Ginkel Punkte 28696

Was Sie sehen, ist die Gesamtnutzung der Anwendung. Das sind 800 MB und das wird auch so bleiben. Wie in den Kommentaren erwähnt, lässt die Speicherbereinigung es so aussehen, als ob die Anwendung weniger Speicher verbraucht. Sie können versuchen, auf alle Werte im Wörterbuch zuzugreifen, nachdem Sie den Speicherbereiniger ausgeführt haben. Sie werden sehen, dass der Speicherverbrauch wieder ansteigt (er wird aus dem Swap-Bereich gelesen).

Was Sie wahrscheinlich wollen, ist, dass nicht alle diese Daten in den Speicher geladen werden. Gibt es eine Möglichkeit, die gleichen Ergebnisse mit einem Algorithmus zu erzielen?

Alternativ, und das wäre wahrscheinlich die beste Option, wenn Sie hier tatsächlich Informationen speichern wollen, könnten Sie eine Datenbank verwenden. Wenn es umständlich ist, eine normale Datenbank wie SQLExpress zu verwenden, können Sie sich auch für SQLite .

0voto

Miguel Punkte 3326

Vielen Dank für die vielen Antworten. Die Daten müssen tatsächlich während der gesamten Laufzeit der Anwendung geladen werden, daher denke ich, dass es aufgrund Ihrer Antworten nichts Besseres zu tun gibt... Ich könnte es vielleicht mit einer externen Datenbank versuchen, aber da ich bereits mit zwei anderen Datenbanken gleichzeitig arbeiten muss, halte ich das für keine gute Idee.

Glauben Sie, dass es möglich ist, mit drei Datenbanken gleichzeitig zu arbeiten, ohne an Leistung zu verlieren?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X