2014-09-25 9 views
14

Ich erstelle ein Programm, das eine Art von Cache implementiert. Ich brauche so viel Speicher wie möglich zu verwenden und zu tun, dass ich zwei Dinge zu tun:Überprüfen Sie die Speicherauslastung in Haskell

  1. prüfen, wie viel Speicher im System noch verfügbar ist (RAM, nicht nur swap)
  2. prüfen, wie viel Speicher mein App verwendet bereits.

Ich brauche eine plattformunabhängige Lösung (Linux, Windows, etc.).

Mit diesen zwei Informationen werde ich die Größe des Caches reduzieren oder vergrößern. Wie kann ich diese Informationen in Haskell bekommen? Gibt es Pakete, die diese Informationen bereitstellen können?

+1

"Überprüfen Sie, wie viel Speicher noch im System verfügbar ist". Diese Frage hat nicht viel Sinn. Sie haben eine Auslagerungsdatei, die bis zu 2 TB groß werden kann. Ist all diese Erinnerung "verfügbar"? Wenn Sie alles in Anspruch nehmen, wird Ihr System zum Stillstand kommen. Vielleicht möchten Sie das physische Gedächtnis überprüfen. Aber was, wenn Sie in einem Browser 300 Tabs geöffnet haben, die alle eine Woche lang unberührt sitzen? Sie sind bereit, mit einem Schlag ausgetauscht zu werden, aber sie belegen gerade 99,5% des physischen Gedächtnisses, so dass Sie überhaupt nichts "verfügbar" haben. –

+1

@ n.m. Ich denke, dass es offensichtlich ist, dass zum Implementieren des Caches ich viel freien Speicherplatz benötige, der im RAM ist, nicht im SWAP. Es ist keine gute Idee, einen Cache zu erstellen, der Systemwechsel ermöglicht. ; p – remdezx

+0

Warum darf der Benutzer nicht die Cache-Größe angeben? Sie wollen vielleicht kein Programm, das sowieso automatisch den gesamten RAM benutzt. –

Antwort

3

Ich kann nicht sofort sehen, wie man das portabel macht.

Allerdings hat GHC "schwache Zeiger". (Siehe System.Mem.Weak.) Wenn Sie Objekte erstellen und sich nur über schwache Zeiger an sie halten, wird der Garbage Collector automatisch beginnen, Elemente zu löschen, wenn der physische Arbeitsspeicher knapp wird.

(Leider ist diese gibt Ihnen die Fähigkeit welche Artikel zu entscheiden, zuerst löschen — zB diejenigen, die am billigsten sind neu zu erstellen oder diejenigen, die am wenigsten verwendet wurden, oder so ähnlich.)

+0

Sieht sehr interessant aus! Leider wird es einige Architekturänderungen erfordern, aber ich kann darüber nachdenken. Vielen Dank! – remdezx

+0

Sie können auch interessiert sein zu wissen, dass 'System.Mem' Funktionen enthält, um den GC zu einem bestimmten Zeitpunkt (z. B. nachdem Sie gerade ein wirklich großes Objekt verwendet haben) zu starten. Nicht direkt mit Ihrer Frage verbunden, könnte aber interessant sein. – MathematicalOrchid

+0

Ich weiß, ich fand sie, als ich mehr in das Thema graben :) – remdezx

Verwandte Themen