Как указал eulerfx,
структура таблицы указывает, что может быть несколько документов для задачи
, и Крис заявил:
Помещая Task_ID в документ, фактическая связь - это HasMany, но у вас есть какое-то неявное понимание того, что на одну задачу будет только один документ.
Это, конечно, правильно, поэтому я перевернул его, чтобы у Task был обнуляемый Document_Id.
Спасибо вам обоим за вашу помощь!
Я подбросил монету за принятый ответ, если бы я мог поставить галочку и то, и другое!
Было бы полезно взглянуть на код, но если вы хотите отладить его самостоятельно, посмотрите Xdebug , он поможет профилировать ваше приложение.
Конечно, в зависимости от того, что вы делаете, возможно, он накапливает некоторую память, хотя 132 МБ кажется уже большим объемом для 2500 записей. Конечно, при необходимости вы можете изменить ограничение памяти в php.ini.
Насколько велик CSV-файл, который вы читаете? И какие объекты и какую обработку вы с ним делаете?
you could try a local installation of php5.3 and call http://www.php.net/manual/en/function.gc-collect-cycles.php.
gc_collect_cycles
— Forces collection of any existing garbage cycles
if the situation improves, you at least verified (on of) the problem(s).
Это зависит от того, как вы очищаете переменные после того, как закончили с ними.
Похоже, вы закончили с записью, но вы все еще где-то храните информацию. Используйте unset () , чтобы очистить переменные, если есть сомнения.
Пожалуйста, предоставьте минимальный образец кода воспроизведения, чтобы увидеть, куда уходит вся эта память, если это не помогает.
Кстати, создание наименьшего образца кода, который будет воспроизводить проблему, - отличный метод отладки, потому что он заставляет вас снова пройти код с осторожностью.
Если вы действительно подозреваете, что в вашем скрипте есть только одна или две утечки памяти, которые вызывают его сбой, тогда вам следует выполните следующие шаги:
memory_limit
на что-то маленькое, например 500 КБ Пример:
ini_set('memory_limit', 1024 * 500);
$fp = fopen("test.csv", 'r');
while($row = fgetcsv($fp)) {
validate_row($row); // step 1: validate
// add these back in one by one and keep an eye on memory usage
//calculate_fizz($row); // step 2: fizz
//calculate_buzz($row); // step 3: buzz
//triangulate($row); // step 4: triangulate
}
echo "Memory used: ", memory_get_peak_usage(), "\n";
В худшем случае все из ваши этапы обработки умеренно неэффективны, и вам нужно будет их все оптимизировать.
Можете ли вы изменить свой memory_limit в своем php.ini?
Кроме того, может ли команда unset ($ var) для переменных освободить некоторую память? Может ли $ var = null помочь?
См. Также этот вопрос: Что лучше для освобождения памяти с помощью PHP: unset () или $ var = null
Как вы читаете файл? Если вы используете fread / filegetcontents или другие подобные функции, тогда вы собираетесь использовать весь размер файла (или то, сколько вы загружаете с помощью fread) в памяти, поскольку весь файл загружается во время вызова. Однако, если вы используете fgetcsv if, вы будете читать только одну строку за раз, в зависимости от длины строки, это может значительно упростить вашу память.
Также убедитесь, что вы повторно используете столько переменных, сколько возможно на каждой петле. Убедитесь, что в них нет массивов с большими объемами данных.
Трудно сказать причину, не увидев кода. Однако типичной проблемой являются рекурсивные ссылки, т.е. объект A указывает на объект B и наоборот, что может привести к ошибкам GC.
Я не знаю, как вы сейчас обрабатываете файл, но вы можете попытаться прочитать файл только в одной строке время. Если вы прочитаете весь файл сразу, это может занять больше памяти.
На самом деле это одна из причин, по которой я часто предпочитаю Python для задач пакетной обработки.