php, substr, «недостаточно памяти» - PullRequest
1 голос
/ 11 марта 2011

Итак, у меня есть скрипт, который импортирует CSV-файлы в таблицу контактов в базе данных.

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

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

Когда я передаю данные в функцию для создания запроса для помещения его в базу данных, я получаю сообщение об ошибке «недостаточно памяти» для функции substr (), когда она завершает запрос.

$q = substr($q, 0, -1);

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

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

@ Horse: Если вы знаете, каким будет персонаж, вы можете попробовать

$q = rtrim($q, ","); // if it is a comma, for instance

В противном случае вы можете увидеть, если вы получите ту же ошибку с

$q = mb_substr($q, 0, -1);

или

$q = substr_replace($q, "", -1)
1 голос
/ 11 марта 2011

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

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

И вы всегда можете увеличить предел памяти, конечно. Это было бы проще всего сделать.

Наконец, мой опыт показывает, что строка, сообщаемая об ошибке ограничения памяти, почти никогда не является реальной причиной. Это просто линия, где произошла ошибка. Проблема обычно раньше в коде и более алгоритмична, чем что-либо еще. Поэтому я бы не стал слишком сильно концентрироваться на этом вызове substr (). Работайте над своим общим использованием памяти.

...