В this SO thread, я узнал, что сохранение ссылки на seq
на большой коллекции предотвратит сбор всей коллекции от мусора.Когда следует избегать использования `seq` в Clojure?
Во-первых, эта тема с 2009 года. Это все еще верно в «современном» Clojure (v1.4.0 или v1.5.0)?
Во-вторых, относится ли эта проблема к ленивым последовательностям? Например, может ли (def s (drop 999 (seq (range 1000))))
разрешить сборщику мусора убирать первые 999
элементов последовательности?
Наконец, есть ли хороший способ обойти эту проблему для больших коллекций? Другими словами, если бы у меня был вектор, например, 10 миллионов элементов, я мог бы использовать вектор таким образом, чтобы потребляемые части могли быть собраны в мусор? А если бы у меня была хэш-карта с 10 миллионами элементов?
Причина, по которой я прошу, состоит в том, что я работаю на довольно больших наборах данных, и мне нужно быть более осторожными, чтобы не сохранять ссылки на объекты, так что объекты, которые мне не нужны, могут быть собраны в мусор. Как бы то ни было, в некоторых случаях я сталкиваюсь с ошибкой java.lang.OutOfMemoryError: GC overhead limit exceeded
.
Я думаю, что пример cgrand '(drop 999990 (vec (диапазон 1000000)))' обусловлен промежуточным вектором и поведением 'subvec'toring. Я не подозреваю, что ленивая последовательность 'cons'ed сделала бы это. Если вам нужно освободить вектор, сохранив подвектор, вы можете скопировать подвектор 'в' новый вектор. Очень интересный вопрос, хотя, я тоже жду ответа! –