Массивы в PHP - это своеобразные вещи: их можно использовать в качестве списков, очередей, словарей, множеств, упорядоченных словарей и всевозможных других многозначных структур. Однако большинство функций написаны с учетом одной или двух из этих структур.
В случае array_reduce
, массив обрабатывается как список - упорядоченная коллекция элементов. Таким образом, ключи массива не передаются обратному вызову. Это имеет смысл для общих случаев, таких как вычисление итога или среднего и т. Д.
Несомненно, есть случаи, когда вы хотите уменьшить упорядоченный словарь пар ключ-значение; к сожалению, PHP не предоставляет для этого функции.
С другой стороны, есть две связанные функции, которые могут быть использованы вместо:
array_map
, который выполняет обратный вызов для каждого элемента и создает новый массив с одним элементом вывода для элемент ввода array_walk
, который запускает обратный вызов для каждого элемента и игнорирует результат, но может принимать третий параметр по ссылке, где могут накапливаться побочные эффекты Все три функции также могут быть тривиально реализованы с помощью цикла foreach
, так что вы можете написать свою собственную функцию reduce
примерно так ( untested ):
function array_reduce_assoc(array $array, callable $callback, $initial=null) {
$carry = $initial;
foreach ( $array as $key => $value ) {
$carry = $callback($carry, $key, $value);
}
}
Я проверил бы Настраивающий Раздел CLR в документ упомянутый Gulzar.
Как другие плакаты, на которые указывают, любой объект, который реализует IDispose
должен иметь Dispose()
обращенный это, когда это закончено с, предпочтительно с помощью using
создать.
Разжечь perfmon.exe
и добавьте эти счетчики:
- Байты Process\Private
- .NET CLR Байты Memory# во всей "куче"
- Набор Process\Working
- .NET CLR размер "кучи" Объекта Memory\Large
Увеличение частных Байтов, в то время как число Байтов во всем счетчике "кучи" остается тем же, указывает на неуправляемое потребление памяти.
Увеличение обоих счетчиков указывает на потребление управляемой памяти
проверьте раздел по поиску и устранению неисправностей узких мест памяти в Настройке Производительности приложения.NET
Если у Вас есть доступ к исходному коду, можно хотеть проверить, что на любые объекты, которые реализуют IDisposable, ссылаются внутри using
операторы или быть правильно избавленным, когда Вы сделаны с ними.
Using
конструкция C#, но основная идея состоит в том, что Вы освобождаете ресурсы, когда Вы сделаны.
Другой вещью начать работу являются большие объекты, вставляемые "в процессе" состояние сеанса или кэш.
Больше деталей определенно помогло бы. Сколько приложений запускает в пуле приложений? Есть ли в пуле приложения ASP.NET?
Если Вы выполняете ASP.NET, бросаете хороший взгляд на то, что Вы храните в переменных кэша и сессии. Используйте PerfMon для проверки, сколько Поколения 0, происходят 1 и 2 набора. Опасайтесь хранить элементы UI в состоянии сеанса или кэше, так как это предотвратит весь экземпляр страницы и всех детей экземпляра страницы от того, чтобы быть собранным также. Наконец, проверьте, чтобы видеть, делаете ли Вы большую конкатенацию строк. Это может вызвать много объектных инстанцирований, так как строки.NET неизменны. Изучите использование StringBuilder вместо этого.
Создайте мини-дамп процесса w3wp и используйте WinDbg для наблюдения, какие объекты находятся в памяти. Это - то, что делает служба поддержки IIS в Microsoft каждый раз, когда они получают вопросы как это.
Поскольку другие люди отметили, что частой причиной этой проблемы является утечка ресурса, также существует известная проблема с win2k3 сервером и IIS6 KB916984