Недавно я наткнулся на проблему Вольфрам говорит, что сумма расходится, но Mathematica дает числовое значение. Это говорит о том, что 1/(n * log(n) - n)
не суммируется (или не сходится математически, чтобы быть правильным). Интересно то, что мы все еще можем попытаться вычислить сумму численно, несмотря на то, что она «не суммируется». Mathematica дает ~ 6.1
как числовой ответ.
ХОРОШО. Я думаю, давайте попробуем воспроизвести это число (или что-то подобное) в сценарии PHP суммирования этой серии. Мой код был:
$formula = function ($n) {return 1/($n * log($n) - $n);};
$n=2;
$sum=0;
while(true) {
$term_n = $formula($n);
$sum += $term_n;
if ($n++ % 100000 == 0) {
if ($sum > 5.8)
usleep(1000);
echo "n=".number_format($n-1)."; sum={$sum}; error={$term_n}\n";
}
}
Мой алгоритм вычислил ответ до 5.866
а затем произошло одно из двух:
Это произошло после примерно 34 миллионов итераций.
Позже я проверил, как изменяется нагрузка на процессор в связи с вычислением большего количества последовательных терминов.
Теперь интересная часть:
примерно на 22 миллионах итераций ядра испытывали трудности с переключением задач между собой:
Позже, примерно за 33 миллиона итераций, ядра достигли точки невозврата — они вообще отказались работать:
Вопрос в том — Что такого особенного в сумме 5.866
что это сбивает компьютер? — учитывая тот факт, что ни число итераций N не очень велико (всего 34 миллиона), ни N-й член не очень мал (всего 1.7E-9) — поэтому нет причин для сингулярности.
Просто предположение, но звучит так, будто компьютеру не хватает памяти. Ваш сценарий явно не выделяет какую-либо память, но, возможно, ваша версия PHP содержит ошибку и как-то теряет память.
Если свободная память была исчерпана, это может привести к выходу из строя работающей ОС или к тому, что она убьет ваш сценарий, чтобы защитить себя.
Если система начала интенсивно использовать пространство подкачки для компенсации, это на мгновение остановит ваш скрипт, что вызовет колебания в графиках ЦП, которые вы наблюдаете.
Я сузил проблему до ее корней — чем больше вызовов функций выполняется в скрипте, тем больше утечек памяти. И не имеет значения, какую функцию (и) вызывать — пользовательскую, sin (), log () или min (,) или что-то еще. Поэтому я подозреваю, что это ошибка в ядре PHP, которая возникает при определенных условиях / ОС ядра.
Тестовый код:
define('AMOUNT', 2000000);
if ($argc == 1)
for ($i=AMOUNT; $i <= 3*AMOUNT; $i+=AMOUNT)
shell_exec('php ' . __FILE__ . " {$i}");
else
for ($i=0; $i < $argv[1]; $i++)
sin(1);
/*
Change line above into something without a function call to stop memory leak :
$x++; // for example
*/
выдает такой график утечки памяти: