Что делает 'Обезьяну, Исправляющую' точно Средний в Ruby?

Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini, либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.

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

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

Вопросы, относящиеся:

62
задан Mechanical snail 13 September 2012 в 00:53
поделиться

6 ответов

Короткий ответ - то, что нет никакого "точного" значения, потому что это - новый термин, и различные люди используют его по-другому. То, что много, по крайней мере, может быть различено из статьи Wikipedia. Существуют некоторые, кто настаивает, что это только относится к коду "во время выполнения" (встроенные классы, я предполагаю), в то время как некоторые использовали бы его для обращения к модификации во время выполнения любого класса.

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

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

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

44
ответ дан Joshua Swink 24 November 2019 в 16:42
поделиться

Исправление обезьяны состоит в том, когда Вы замена методы класса во времени выполнения ( не добавляющие новые методы, поскольку другие описали).

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

19
ответ дан Ana Betts 24 November 2019 в 16:42
поделиться

Вы корректны; это - когда Вы изменяете или расширяете существующий класс, а не разделяете его на подклассы.

4
ответ дан davetron5000 24 November 2019 в 16:42
поделиться

Это - исправление обезьяны:

class Float
  def self.times(&block)
    self.to_i.times { |i| yield(i) }
    remainder = self - self.to_i
    yield(remainder) if remainder > 0.0
  end
end

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

def my_method(my_special_number)
  sum = 0
  my_special_number.times { |num| sum << some_val ** num }
  sum
end

И это повреждается [только 116] иногда , когда это называют. Тем, которые обращают внимание, Вы уже знаете, почему, но предполагают, что Вы не знали о типе плавающем, имеющем .times метод класса, и Вы автоматически предположили, что my_special_number целое число. Каждый раз, когда параметр является целым числом, целым числом или плаванием, это хорошо работало бы (целые ints пасуются назад кроме тех случаев, когда существует остаток с плавающей точкой). Но передайте число с чем-либо в десятичной области в, и она повредится наверняка!

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


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

3
ответ дан Robert K 24 November 2019 в 16:42
поделиться

В Python monkeypatching назван много знаком затруднения: "У меня был к monkeypatch этот класс потому что..." (Я встретился с ним сначала при контакте с Zope, который статья упоминает). Это используется, чтобы сказать, что было необходимо захватить восходящий класс и зафиксировать его во времени выполнения вместо того, чтобы лоббировать, чтобы зафиксировать нежелательные поведения в фактическом классе или фиксировать их в подклассе. По моему опыту, люди Ruby не говорят о monkeypatching так очень, потому что это не считают особенно плохим или даже примечательным (следовательно "утиная перфорация"). Очевидно, необходимо быть осторожны относительно изменения возвращаемых значений метода, который будет использоваться в других зависимостях, но добавляющие методы к классу способ, которым делают active_support и фасеты, совершенно безопасны.

Обновление 10 лет спустя : Я исправил бы последнее предложение для высказывания, "относительно безопасно". Расширение класса оперативной библиотеки с новыми методами может привести к проблемам, если кто-то еще получает ту же идею и добавляет тот же метод с различной реализацией или сигнатурой метода, или если люди путают расширенные методы для функциональности базового языка. Оба случая часто происходят в Ruby (особенно относительно active_support методов).

2
ответ дан method 24 November 2019 в 16:42
поделиться

Обычно это предназначено о специальных изменениях, с помощью Ruby открытые классы, часто с низкокачественным кодом.

Хорошее продолжение на предмете:

http://www.infoq.com/articles/ruby-open-classes-monkeypatching

1
ответ дан maurycy 24 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: