2014-09-25 3 views
14

Я создаю программу, которая реализует какой-то кеш. Мне нужно использовать столько памяти, сколько возможно, и для этого мне нужно сделать две вещи:Проверка использования памяти в haskell

  1. Проверьте, сколько памяти по-прежнему доступен в системе (RAM только не SWAP)
  2. Проверьте, сколько памяти моей приложение уже использует.

Мне нужно независимое от платформы решение (Linux, Windows и т. Д.).

Используя эти две части информации, я уменьшу размер кеша или увеличу его. Как я могу получить эту информацию в Haskell? Существуют ли какие-либо пакеты, которые могут предоставить эту информацию?

+1

«Проверьте, сколько памяти все еще доступно в системе». Этот вопрос не имеет большого смысла. У вас есть файл подкачки, который может вырасти до 2 ТБ. Является ли все это память «доступной»? Если вы займете все это, ваша система остановится. Возможно, вы хотите проверить физическую память. Но что делать, если в браузере открыто 300 вкладок, которые не работают в течение недели? Они готовы быть заменены на каплю шляпы, но сейчас они занимают 99,5% физической памяти, поэтому у вас нет ничего «доступного». –

+1

@ н.м. Я думаю, что очевидно, что для реализации кеша мне нужно количество свободного пространства, которое находится в ОЗУ, а не в SWAP. Построение кеша, который сделает обмен системой, не является хорошей идеей. ; p – remdezx

+0

Почему бы вам не указать размер кеша? Они могут не захотеть, чтобы программа автоматически использовала всю RAM. –

ответ

3

Я не могу сразу увидеть, как это сделать портативно.

Однако GHC имеет «слабые указатели». (См. System.Mem.Weak.) Если вы создаете элементы и вешаете их с помощью слабых указателей (только), то сборщик мусора автоматически начнет удалять элементы, если вы запустили низкую физическую память.

(К сожалению, это не дает вам возможность решить, какие элементов для удаления первого — например, те, которые являются дешевыми, чтобы воссоздать или те, которые были наименее используемыми или что-то.)

+0

Выглядит очень интересно! К сожалению, для этого потребуется некоторое изменение архитектуры, но я могу это рассмотреть. Благодаря! – remdezx

+0

Вам также может быть интересно узнать, что 'System.Mem' содержит функции, которые провоцируют GC для запуска в определенное время (например, после того, как вы просто остановили использование действительно большого объекта). Не имеет прямого отношения к вашему вопросу, но может быть интересным. – MathematicalOrchid

+0

Я знаю, я нашел их, когда я копал больше в эту тему :) – remdezx