Массовая вставка базы данных в несколько таблиц (с взаимными ассоциациями) в PHP - PullRequest
0 голосов
/ 23 января 2019

У меня есть большой объем данных, которые я пытаюсь вставить в базу данных (порядок, с которым я работаю: 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, потому что он не был вставлен.

Если использование доктрины не может быть и речи, как мне заставить этот подход работать?

...