В настоящее время я создаю команду PHP, которая может обновлять мои индексы ElasticSearch.
Но я заметил одну важную вещь: сериализация сущностей, когда мой массив содержит более 10000 из них, занимает слишком много времени. Я думал, что это будет линейно, но 6 или 9 тысяч сущностей занимают около минуты (нет большой разницы между 6 или 9 тысячами), но когда вы проходите 10 тысяч, это просто замедляется до такой степени, что занимает до 10 минут.
...
// we iterate on the documents previously requested to the sql database
foreach($entities as $index_name => $entity_array) {
$underscoreClassName = $this->toUnderscore($index_name); // elasticsearch understands underscored names
$camelcaseClassName = $this->toCamelCase($index_name); // sql understands camelcase names
// we get the serialization groups for each index from the config file
$groups = $indexesInfos[$underscoreClassName]['types'][$underscoreClassName]['serializer']['groups'];
foreach($entity_array as $entity) {
// each entity is serialized as a json array
$data = $this->serializer->serialize($entity, 'json', SerializationContext::create()->setGroups($groups));
// each serialized entity as json is converted as an Elastica document
$documents[$index_name][] = new \Elastica\Document($entityToFind[$index_name][$entity->getId()], $data);
}
}
...
Вокруг этого целый класс, но это то, что занимает большую часть времени.
Я понимаю, что сериализация — сложная операция и требует времени, но почему почти нет разницы между 6, 7, 8 или 9k, но когда более 10k сущностей, это занимает много времени?
PS: Для справки: я открыл вопрос на github.
РЕДАКТИРОВАТЬ :
Чтобы объяснить, что я пытаюсь сделать более точно, у нас есть база данных SQL в проекте Symfony, используем Doctrine для связывания обоих, и мы используем ElasticSearch (и пакеты FOSElastica и Elastica) для индексации наших данных в ElasticSearch.
Дело в том, что в то время как FOSElastica заботится об обновлении данных, которые обновляются в базе данных SQL, она не обновляет каждый индекс, содержащий эти данные. (Например, если у вас есть автор и две книги, которые он написал, в ES у вас будут две книги с автором и автором. FOSElastica обновляет только автора, а не информацию об авторе в двух книгах. ).
Итак, чтобы позаботиться об этом, я делаю скрипт, который прослушивает каждое обновление, сделанное через Doctrine, получает каждый документ ElasticSearch, связанный с обновленным, и также обновляет их. Это работает, но слишком долго для моего стресс-теста с более чем 10000 больших документов для обновления.
РЕДАКТИРОВАТЬ :
Чтобы добавить больше информации о том, что я пробовал, у меня возникла та же проблема при использовании команды «заполнить» из FOSElastica. Когда 9к, то все нормально и плавно, а когда 10к, то очень долго.
В настоящее время я запускаю тест с уменьшением размера моего массива в моем скрипте и его сбросом, пока не повезло.