Я пытаюсь сохранить массивы & списки & наборы данных как можно меньше. Отдельный объект не имеет значения очень, поскольку создание и сборка "мусора" довольно быстро на наиболее современных языках.
В случаях необходимо считать своего рода огромный набор данных из базы данных, удостоверьтесь, что читали во вперед/только способ и обработали его в небольших битах вместо этого og загрузка всего в память сначала.
Я использую Python, но я предполагаю, что стратегии подобны.
я пытаюсь использовать небольшие функции/методы, так, чтобы локальные переменные были автоматически собраны "мусор", когда Вы возвращаетесь к вызывающей стороне.
В больших функциях/методах я явно удаляю большие временные объекты (как списки), когда они больше не необходимы. Заключительные ресурсы как можно раньше могли бы помочь также.
Я являюсь довольно новым в Ruby, но до сих пор я не нашел необходимым сделать что-либо специальное в этом отношении (то есть, вне того, что я просто склонен делать как программист обычно). Возможно, это вызвано тем, что память является более дешевой, чем время, которое потребовалось бы для серьезной оптимизации для него (мой код Ruby работает на машинах с 4-12 ГБ RAM). Это могло бы также быть, потому что задания, для которых я использую его, не продолжительны (т.е. это собирается зависеть от Вашего приложения).
Избегайте кода как это:
str = ''
veryLargeArray.each do |foo|
str += foo
# but str << foo is fine (read update below)
end
, который создаст каждую промежуточную строковую стоимость, поскольку Строка возражает и затем удаляет свою единственную ссылку на следующем повторении. Это выбрасывает память с тоннами все больше длинных строк, которые должны быть собраны "мусор".
Вместо этого используйте Array#join
:
str = veryLargeArray.join('')
Это реализовано в C очень эффективно и не подвергается Строковому созданию наверху.
ОБНОВЛЕНИЕ: Jonas прав в комментарии ниже. Мое предупреждение содержит для +=
, но не <<
.
Смотрите на Маленькое программное обеспечение Памяти - Шаблоны для Систем с Ограниченной памятью . Вы не определяете, какое ограничение памяти, но я принимаю RAM. В то время как не определенный для Ruby, я думаю, что Вы найдете некоторые полезные идеи в этой книге - шаблоны покрывают RAM, ROM и внешнюю память, и разделены на главные методы небольших структур данных, выделения памяти, сжатия, внешней памяти и маленькой архитектуры.
Кроме в использовании памяти крайних случаев не что-то для волнения о. Время Вы тратите попытку уменьшить использование памяти, купит ПАРТИЯ из гигабайтов.
Я не рубиновый разработчик, но я думаю, некоторые методы и методы верны для любого языка:
Использование минимальная переменная размера, подходящая для задания
, Уничтожает и закрывает переменные и соединения, если не используемые
Однако, если у Вас будет объект, то необходимо будет использовать, много раз считают хранение его в объеме Любыми циклами с манипуляциями большой строковой разностью потенциалов работа над меньшей строкой и затем добавляют к большей строке
достойное Использование (попробуйте выгоду наконец), обработка ошибок для проверки объекты и соединения закрываются
, Когда контакт с наборами данных только возвращает минимум, необходимый
Я действительно не думаю, что это имеет значение все так очень. Создание Вашего кода, менее читаемого для улучшения потребления памяти, является чем-то, что необходимо только когда-либо делать если Вы потребность это. И потребностью, я имею в виду, имеют конкретный случай для профиля производительности и определенные метрики , которые указывают, что любое изменение решит проблему.
, Если у Вас есть приложение, где память будет ограничивающим фактором, тогда Ruby не может быть лучшим выбором. Однако я нашел, что мои приложения для направляющих обычно используют о 40-60mb из RAM на экземпляр Полукровки. В схеме вещей это не очень.
Вы могли бы быть в состоянии запустить свое приложение на JVM с JRuby - VM Ruby в настоящее время столь не совершенствуется как JVM для управления памятью и сборки "мусора". Эти 1,9 выпуска добавляют много улучшений и также существует альтернативный разрабатываемый VM's.
Я нашел, что Ruby Phusion Enterprise Edition (ветвление магистрали Ruby с очень улучшенной сборкой "мусора") имеет резкое значение в использовании памяти... Плюс, они сделали чрезвычайно легким установить (и удалить, если Вы находите потребность).
можно узнать больше и загрузить его на их веб-сайт .
Единственной вещью, которую мы когда-либо имели, о котором на самом деле стоило вызвать беспокойство, является RMagick.
решение состоит в том, чтобы удостовериться, что Вы используете версию 2 RMagick и вызов Image#destroy!
, когда Вы сделаны с помощью изображения