2014-09-25 67 views
14

Tworzę program, który implementuje pewien rodzaj pamięci podręcznej. Muszę używać jak najwięcej pamięci, jak to możliwe, aby to zrobić muszę zrobić dwie rzeczy:Sprawdź użycie pamięci w haskell

  1. sprawdzić ile pamięci jest nadal dostępne w systemie (tylko w pamięci RAM, a nie swap)
  2. sprawdzić ile pamięci mój Aplikacja już korzysta.

Potrzebuję niezależnego od platformy rozwiązania (Linux, Windows itp.).

Za pomocą tych dwóch informacji zmniejszę rozmiar pamięci podręcznej lub ją powiększę. Jak mogę uzyskać te informacje w Haskell? Czy są jakieś pakiety, które mogą dostarczyć te informacje?

+1

"Sprawdź, ile pamięci wciąż jest dostępne w systemie". To pytanie nie ma wiele sensu. Masz plik wymiany, który może dorastać do 2 TB. Czy cała ta pamięć jest "dostępna"? Jeśli zajmiesz się tym wszystkim, twój system zatrzyma się. Być może chcesz sprawdzić pamięć fizyczną. Ale co, jeśli masz otwartych 300 kart w przeglądarce, które siedzą nietknięte przez tydzień? Są gotowe do wymiany na kroplę kapelusza, ale teraz zajmują 99,5% fizycznej pamięci, więc nie masz nic "dostępnego". –

+1

@ n.m. Myślę, że to oczywiste, że aby zaimplementować pamięć podręczną, potrzebuję wolnej pamięci RAM, a nie SWAP. Budowanie pamięci podręcznej, która spowoduje zamiany systemu, nie jest dobrym pomysłem. ; p – remdezx

+0

Dlaczego nie pozwolić użytkownikowi określić rozmiar pamięci podręcznej? Mogą nie chcieć programu, który i tak automatycznie używa całej pamięci RAM. –

Odpowiedz

3

Nie mogę od razu zobaczyć, jak to zrobić przenośnie.

Jednak GHC ma "słabe wskaźniki". (Patrz System.Mem.Weak.) Jeśli utworzysz elementy i powiesisz je za pomocą słabych wskaźników (tylko), wówczas będzie automatycznie kasował elementy, jeśli skończy Ci się pamięć fizyczna.

(Niestety, to nie daje możliwość decydowania które elementy do usunięcia najpierw — przykład te, które są najtańsze, aby odtworzyć lub te, które zostały najmniej używanych lub coś.)

+0

Wygląda bardzo interesująco! Niestety, będzie to wymagało zmiany architektury, ale mogę to rozważyć. Dzięki! – remdezx

+0

Możesz również wiedzieć, że 'System.Mem' zawiera funkcje, które prowokują GC do uruchomienia w określonym czasie (np. Po prostu przestałeś używać naprawdę dużego obiektu). Nie jest to bezpośrednio związane z Twoim pytaniem, ale może być interesujące. – MathematicalOrchid

+0

Wiem, znalazłem je, gdy kopałem więcej w tym temacie :) – remdezx