2009-09-17 16 views
6

Bezogen auf meine vorherige Frage einnimmt:
Preventing Memory issues when handling large amounts of textWie kann ich feststellen, wie viel Speicher mein Programm derzeit

Gibt es eine Möglichkeit, wie viel Speicherplatz mein Programm zu bestimmen, ist besetzt ? Ich bearbeite eine große Menge an Textdateien und speichere die verarbeiteten Objekte normalerweise im Speicher. Es gibt Zeiten, in denen es zu viele Informationen geben wird, und mir wird die Erinnerung ausgehen. Ich habe eine Lösung, um das Speicherzuweisungsproblem zu vermeiden, aber ich möchte es nur bei Bedarf verwenden, um Paging zu vermeiden, was letztendlich meine Leistung verringern wird, wenn es nicht notwendig ist. Gibt es eine Möglichkeit, herauszufinden, wie viel Speicher ich besetze, damit ich meine Informationen nur bei Bedarf pagen kann?

HINWEIS: Ich bin auf der Suche nach einer Lösung, die mein Programm verwenden kann, um bei Bedarf zu blättern.

Antwort

5

Sie können GC.GetTotalMemory versuchen:

Ruft die Anzahl der Bytes zur Zeit angenommen, zugeordnet werden. Ein Parameter zeigt an, ob diese Methode vor der Rückgabe ein kurzes Intervall warten kann, damit das System Müll sammeln und Objekte finalisieren kann.

Die wichtige Sache zu beachten ist, dieser Teil: „Ruft die Anzahl der Bytes zur Zeit angenommen, zugeordnet werden“. Dies bedeutet, dass diese Methode möglicherweise nicht zu 100% genau ist. Solange Sie dies wissen, sollten Sie in der Lage sein, eine ungefähre Vorstellung von der Auslastung Ihres virtuellen Speichers zu einem bestimmten Zeitpunkt in Ihrer Anwendungsausführung zu bekommen.

Edit: Lassen Sie mich jetzt eine andere Lösung anbieten, die wahrscheinlich produktiver sein wird: Verwenden Sie perfmon und die CLR performance counters.

+0

> "[...] beste verfügbare Annäherung der Anzahl von Bytes zur Zeit in verwalteten Speicher zugewiesen" wont diese die Speichermenge abrufen, die von allen verwalteten Assemblys verwendet wird? –

+0

Ja wird es aber nur in der aktuellen AppDomain. Ich empfehle dringend, Perfmon für diese Art von Sache zu verwenden. –

3

Sie müssen wirklich einen Code-Profiler verwenden. Diese werden Ihnen genau sagen, was passiert, wo der Speicher aufgebraucht ist usw.

FYI: Es ist selten, wo Sie denken, dass es ist.

+0

+1: obwohl es Ihre Frage nicht ganz erfüllt (da Sie es im Code machen wollen), ist dies immer noch wahr; Profiling sollte immer noch ein Schritt Ihres Designs sein, da es Aspekte der Speichernutzung beleuchtet, die durch Code-zugängliche Messungen verdeckt werden könnten. Zum Beispiel enthält 'WorkingSet64' Shared Memory, den Sie von der Summe abziehen möchten, wenn Sie entscheiden, ob Sie blättern wollen oder nicht. –

7
long bytes = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
3

lange Bytes = System.Diagnostics.Process.GetCurrentProcess(). WorkingSet64 für mehr See Here

Verwandte Themen