Я написал инструмент для репликации базы данных на PHP. Работает нормально, но есть одна проблема:
Я использую PDO для подключения к различным базам данных, чтобы сохранить его независимым от какой-либо конкретной СУБД, что крайне важно для этого приложения.
Инструмент выполняет некоторый анализ таблиц, чтобы решить, как преобразовать определенные типы и некоторые другие вещи. Затем он делает "SELECT * FROM <tablename>
", чтобы получить строки, которые нужно скопировать. Результирующие наборы довольно большие (около 50 тыс. Строк в некоторых таблицах).
После этого он перебирает набор результатов в цикле while
с PDOStatement::fetch();
, выполняет преобразование типов и экранирование, создает оператор INSERT
и передает его в целевую базу данных.
Все это работает хорошо, за одним исключением. При извлечении строк по одному из набора результатов процесс PHP продолжает поглощать все больше и больше памяти. Я предполагаю, что PDO сохраняет уже обработанные строки в памяти, пока не будет обработан весь набор результатов.
Я также заметил, что когда мой инструмент заканчивает работу с одной таблицей и переходит к следующей, потребление памяти мгновенно падает, что поддерживает мою теорию.
Я НЕ храню данные в переменных PHP! Я держу только одну строку в любой момент времени для обработки, так что это не проблема.
Теперь к вопросу: есть ли способ заставить PDO не хранить все данные в памяти? Я обрабатываю только одну строку за раз, поэтому нет необходимости хранить весь этот мусор. Я действительно хотел бы использовать меньше памяти для этой вещи.