У меня есть большой объем данных, которые я пытаюсь вставить в базу данных (порядок, с которым я работаю: 1e+5
- 1e+6
).Я использую доктрину, и мой первый подход следует следующим правилам: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / reference / batch-processing.html
Однако у меня заканчивается память (страшно Allowed memory size of ## bytes exhausted.
).Кажется, что в доктрине есть утечка памяти или что-то в этом роде.
Функция, которая вызывает это, довольно проста:
private function insertCompareBatch($comparedProducts)
{
foreach ($comparedProducts as $comparedProduct) {
$this->entityManager->persist($comparedProduct->getProduct());
$this->entityManager->persist($comparedProduct);
}
$this->entityManager->flush();
$this->entityManager->clear();
}
Мой первый вопрос: Есть ли способ сделатьподход доктрины работает?
То, что я пробовал:
(т. е. НЕ предлагает следующее)
- Увеличение лимита памяти. (Я уже на пределе своих возможностей).
- Отключение регистратора SQL (Немного помогло, но недостаточно.)
- Сброс / обнуление вещей (Я уже перезаписал параметр в родительской функции, освободившись для gc'd. Что это тогда.)
- Возиться сGC напрямую (бессмысленно, если в GC что-то есть, движок сделает это, когда ему не хватит памяти.)
Альтернативные подходы:
Когда это нене работает, я пытался искать другие решения.И обнаружил LOAD DATA INFILE
.
Однако я не уверен, как это реализовать.Doctrine помогает обрабатывать столбцы и ассоциации с автоинкрементом.
Я легко могу написать связку .csv
s для обеих сущностей, указанных выше, но как мне создать связь между ними?
Сущность ComparedProduct
имеет столбец соединения с сущностью Product
(например, product_id
).Я пока не знаю product_id
, потому что он не был вставлен.
Если использование доктрины не может быть и речи, как мне заставить этот подход работать?