В Clojure, как я могу сказать, сколько памяти использует ссылка? - PullRequest
4 голосов
/ 05 апреля 2011

Я хочу начать определять требования к памяти для моих ссылок и как они растут с использованием приложения.Как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 05 апреля 2011

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

4 голосов
/ 05 апреля 2011

В общем, это не очень полезная вещь: потому что данные, используемые любым конкретным ссылочным документом, вероятно, будут совместно использоваться многими другими ссылками, зная, что эта информация не особенно полезна.

Кроме того, это будет сильно зависеть от JVM - разные реализации JVM могут использовать разные объемы памяти для одних и тех же структур Clojure в зависимости от того, как они решили упаковать структуры данных и указатели.Например, я считаю, что HotSpot дополняет размеры объектов до ближайших 8 байтов, но другие JVM могут делать что-то совершенно другое.Кроме того, 32/64-битные JVM обычно используют указатели разных размеров (но не обязательно очевидным образом, поскольку некоторые 64-битные JVM используют сжатые указатели ....)

Если вы все еще решив сделать это, наилучшим подходом, вероятно, будет рекурсивный спуск структуры данных в ссылке и сложение оценочного размера каждого подэлемента.

  • Вы должны будете сделать предположения или экспериментально проверить размер / накладные расходы каждого возможного типа компонента.Непросто ... см. этот вопрос , чтобы узнать некоторые подробности оценки размеров объектов в JVM.Если вам повезет, вы сможете найти библиотеку, которая сделает это за вас.
  • Вам также нужно будет отслеживать все посещенные объекты, что также немного сложно, так как вам нужносравнивайте идентичность объекта, а не равенство, и, следовательно, вы не сможете использовать ни один из стандартных типов hashmap / set.Будет работать хэш-карта (объектный хэш-код -> коллекция объектов с таким же хеш-кодом).
  • Также будут рассмотрены некоторые забавные угловые случаи, специфичные для Clojure ... например, считаете ли вы метаданные на данныхструктура или нет?

В среднем я все же рекомендовал бы обращать внимание на память, занятую вашим приложением в целом , а не на конкретные ссылки.

3 голосов
/ 05 апреля 2011

Потому что я не могу писать код в комментариях:

(let [a1 large-hash-map]
     [a2 (assoc large-hash-map :foo :bar)]
   ;; now, the two 'pointers' are a1 and a2
   ;; and the data structures they point to can share
   ;; most (but not all) of their data.
   ;; making it more or less meaningless to ask
   ;; how much memory any of the bindings holds
  )

Говорим ли мы о ссылках или простых привязках, это не имеет значения, если речь идет о вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...