У меня простой вопрос. Я определил структуру, и мне нужно инициировать много (порядка миллионов) из них и зацикливаться на них.
Я запускаю по одному и прохожу цикл следующим образом:
using Distributions
mutable struct help_me{Z<:Bool}
can_you_help_me::Z
millions_of_thanks::Z
end
for i in 1:max_iter
tmp_help = help_me(rand(Bernoulli(0.5),1)[1],rand(Bernoulli(0.99),1)[1])
# many follow-up processes
end
Распределение памяти увеличивается в max_iter. Для моей цели мне не нужно сохранять каждую структуру. Есть ли способ «повторно использовать» выделение памяти, используемое структурой?
Привет Оска, спасибо за вопросы. 1. Не знал. Спасибо. 2. На самом деле это может быть не так. Спасибо. Я все еще разрабатываю процессы, через которые должен пройти каждый агент. 3. Не знал. Спасибо. Есть решение проблемы с распределением памяти?
Я думаю, что создание структуры not mutable
исправит это. неизменяемые объекты могут быть выделены в стеке (в большинстве случаев), поэтому их создание и уничтожение должно быть практически бесплатным.
Если структура больше не нужна (т. е. на нее нет ссылок за пределами текущей итерации цикла), сборщик мусора при необходимости автоматически освободит свою память.
В остальном я согласен с предложениями Оскара Смита: выделение памяти и сборка мусора требуют времени, по возможности избегайте этого из соображений производительности.
Ваша основная проблема заключается в следующем:
rand(Bernoulli(0.5),1)[1], rand(Bernoulli(0.99),1)[1]
Вы создаете массив длины 1, а затем читаете первый элемент из этого массива. Это выделяет ненужную память и требует времени. Не создавайте здесь массив. Вместо этого напишите
rand(Bernoulli(0.5)), rand(Bernoulli(0.99))
Это просто создаст случайные скалярные числа, а не массив.
Сравните тайминги здесь:
julia> using BenchmarkTools
julia> @btime rand(Bernoulli(0.5),1)[1]
36.290 ns (1 allocation: 96 bytes)
false
julia> @btime rand(Bernoulli(0.5))
6.708 ns (0 allocations: 0 bytes)
false
В 6 раз быстрее и без выделения памяти.
Кажется, это общая проблема. Очень часто я вижу, как люди пишут rand(1)[1]
, когда им следовало бы использовать просто rand()
.
Кроме того, подумайте, действительно ли вам нужно создавать структуру mutable
, как упоминали другие.
Спасибо. Очень признателен.
Вопрос 1: зачем ты это делаешь
Z<:Bool
?Bool
уже конкретный тип? Вопрос 2: по какой причинеhelp_me
должно бытьmutable
? неизменяемые структуры часто дешевле. также явная передачаrng
вrand
может дать вам легкое двукратное ускорение. (из соображений безопасности многопоточности)