Хорошо, так как вы ищете методы, позвольте мне перечислить некоторые ...
1.Не читайте файлы, транслируйте их
Вместо вызова $data = file_get_contents($file)
, откройте его с помощью fopen
и читайте только те данные, которые вам нужны в этот момент времени (fgets
или fgetcsv
, так далее).Это будет медленнее на ощупь, но будет использовать FAR меньше памяти.
2.Обновление до 5.3.4
Если вы все еще пользуетесь PHP 5.2.x, память будет значительно сэкономлена при обновлении до 5.3.x (последняя версия 5.3.4).Он включает в себя сборщик мусора, который через некоторое время очистит освобожденную память.
3.Не используйте ничего в глобальной области видимости
Не храните информацию в глобальной области видимости.он никогда не очищается до конца выполнения, поэтому может быть утечка памяти сама по себе.
4.Не передавайте ссылки
PHP использует авторское право.Передача ссылок только увеличивает вероятность того, что unset
не получит их все (потому что вы забыли unset
одну из ссылок).Вместо этого просто передайте фактические переменные.
5.Профилируйте код
Профилируйте свой код.Добавьте отладочные хуки в начало и конец каждого вызова функции, а затем регистрируйте их, наблюдая за использованием памяти на входе и выходе каждой функции.Изучите их, и вы узнаете, сколько памяти используется каждой функцией.Возьмите самых больших обидчиков (тех, кого много называют, или используют много памяти) и очистите их ... (низко висящие фрукты).
6.Используйте другой язык
Хотя вы можете сделать это с помощью PHP (у меня есть и делают это довольно часто), осознайте, что это может быть не лучшим инструментом для работы.Для этой конкретной проблемы были разработаны другие языки, так почему бы не использовать один из них (например, Python или Perl) ...
7.Используйте Скретч-файлы
Если вам необходимо отслеживать большое количество данных, не храните все это в памяти все время.Создайте временные файлы (временные файлы) для хранения данных, когда вы их явно не используете.Загружайте файл только тогда, когда вы собираетесь использовать эти конкретные данные, а затем повторно сохраните его и избавьтесь от переменных.
8.Только в крайних случаях: не используйте большие массивы!
Если вам нужно отслеживать большое количество целых чисел (или других простых типов данных), не храните их в массиве!Zval (внутренняя структура данных) имеет немного издержек.Вместо этого, если вам действительно нужно хранить большое количество целых чисел (сотни тысяч или миллионы), используйте строку.Для 1-байтового int, ord($numbers[$n])
получит значение индекса $n
, а $numbers[$n] = chr($value);
установит его.Для многобайтовых целых чисел вам нужно будет сделать $n * $b
, чтобы получить начало последовательности, где $b
- это количество байтов.Я подчеркиваю, что это следует использовать только в крайнем случае, когда вам нужно хранить тонну данных.На самом деле, это было бы лучше, если бы он работал с пустым файлом или с реальной базой данных (вероятно, с временной таблицей), так что это может быть не очень хорошая идея ...
Удачи ...