Я использую WAMP-сервер (32 бита) на локальном хосте на моем персональном компьютере. У меня большой (очень большой) многомерный массив, который получает свою информацию, читая CSV-файл, содержащий длинные предложения (файл CSV содержит 20 000 строк информации). Проблема в том, что я получаю следующую ошибку, когда она проходит через некоторые вычисления:
Неустранимая ошибка: Недостаточно памяти (выделено 1134559232) (попытался выделить 32768 байт) в x: \ wamp \ www \ xxx
Я пробовал различные решения, такие как увеличение upload_max_filesize
, post_max_size
, max_file_uploads
и memory_limit
или установка его в -1 в php.ini или в начале моих скриптов, и никто не работает. Пожалуйста, помогите мне, и, пожалуйста, не просите меня перепроектировать мои коды или изменить версию WAMP, по каким-то причинам это невозможно. Большое спасибо. 🙂
Наконец, я смог найти решение. Я обнаружил, что когда мусор PHP-сборника заполняется, нет возможности его освободить. gc_collect_cycles()
и gc_collect_cycles()
также не эффективны. Единственный способ – использовать Function
над другим разделом кодов. В моем случае у меня был большой скрипт в цикле for, поэтому я скопировал все свои коды в функции, и в моем цикле я вызываю функцию. Каждый раз функция quiets, память освобождается. Вы можете протестировать его, добавив memory_get_usage()
один раз в свою функцию и один раз из функции, чтобы увидеть разницу.
Это ни один из этих параметров, это memory_limit
, максимальный объем памяти, который может использовать PHP-скрипт. Однако убедитесь, что на вашем сервере достаточно ресурсов, прежде чем произвольно увеличить этот параметр.
Поместите эту строку в начало вашего кода:
ini_set("memory_limit", -1);
В руководстве по PHP дается следующее описание memory_limit
:
Это устанавливает максимальный объем памяти в байтах, который разрешен сценарий. Это помогает предотвратить плохо написанные сценарии для съедания всей доступной памяти на сервере. Обратите внимание, что для ограничения объема памяти установите эту директиву на -1.
До PHP 5.2.1 для использования этой директивы он должен был быть включен во время компиляции с использованием –enable-memory-limit в строке configure. Этот флаг времени компиляции также должен был определять функции памяти_get_usage () и memory_get_peak_usage () до 5.2.1.
Когда используется целое число , значение измеряется в байтах. Также могут использоваться сокращенные обозначения, как описано в этом FAQ .
Я не знаю, что делает их настолько уверенными, что только плохо написанные сценарии должны корректировать эту настройку, но я надеюсь, что это краткое введение в любом случае удовлетворяет вашу потребность.