Каковы ваши стратегии, чтобы сохранить низкое использование памяти? - PullRequest
29 голосов
/ 28 сентября 2008

Ruby действительно требует много памяти, но также стоит каждого бита.

Что вы делаете, чтобы сохранить низкое использование памяти? Вы избегаете больших строк и вместо этого используете меньшие массивы / хэши, или это не проблема, чтобы заботиться о вас и позволить сборщику мусора выполнять свою работу?

Редактировать : Я нашел хорошую статью на эту тему здесь - старая, но все еще интересная.

Ответы [ 17 ]

1 голос
/ 09 декабря 2012

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

Будьте осторожны при использовании методов gem / library. Они не могут быть оптимизированы для памяти. Например, у класса Ruby PG :: Result есть метод 'values', который не оптимизирован. Это будет использовать много дополнительной памяти. Я еще не сообщил об этом.

1 голос
/ 31 декабря 2012

Замена реализации malloc (3) на jemalloc немедленно уменьшит потребление памяти до 30%. Я создал драгоценный камень «jemalloc», чтобы достичь этого мгновенно.

1 голос
/ 09 декабря 2012

Необходимо помнить о жизненном цикле ваших объектов. Если ваши объекты не передаются так много, сборщик мусора в конечном итоге сработает и освободит их. Однако, если вы продолжаете ссылаться на них, сборщику мусора может потребоваться несколько циклов, чтобы освободить их. Это особенно верно в Ruby 1.8, где сборщик мусора использует плохую реализацию метода разметки и очистки.

Вы можете столкнуться с этой ситуацией, когда попытаетесь применить некоторые «шаблоны проектирования», такие как декоратор, которые сохраняют объекты в памяти в течение длительного времени. Это может быть неочевидно при использовании примера в отдельности, но в реальных приложениях, где тысячи объектов создаются одновременно, затраты на увеличение памяти будут значительными.

1 голос
/ 28 сентября 2008

Я довольно новичок в Ruby, но до сих пор я не счел необходимым делать что-то особенное в этом отношении (то есть за пределами того, что я обычно склонен делать как программист). Возможно, это связано с тем, что память дешевле, чем время, необходимое для ее серьезной оптимизации (мой код Ruby работает на компьютерах с 4-12 ГБ ОЗУ). Это также может быть связано с тем, что задания, для которых я его использую, не являются долгосрочными (т.е. это будет зависеть от вашего приложения).

1 голос
/ 02 октября 2008

Я использую Python, но, думаю, стратегии похожи.

Я пытаюсь использовать небольшие функции / методы, чтобы локальные переменные автоматически собирали мусор при возврате вызывающей стороне.

В больших функциях / методах я явно удаляю большие временные объекты (например, списки), когда они больше не нужны. Также может помочь закрытие ресурсов как можно раньше.

0 голосов
/ 28 сентября 2008

Я стараюсь, чтобы массивы, списки и наборы данных были как можно меньше. Отдельный объект не имеет большого значения, поскольку создание и сборка мусора довольно быстры в большинстве современных языков.

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

0 голосов
/ 23 ноября 2011

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

...