
Yuriy
21.01.2017
13:07:36
спасбо всем,
получилось

Aleksandr
21.01.2017
23:31:28

Salavat
22.01.2017
03:25:34
Доброе утро, тем кто не спит
Есть база данных (старая). Нужно конвертировать в новую.
Сделал костыль через fixture

Google

Salavat
22.01.2017
03:28:41
Простые записи - обрабатываются легко. а там где джойны есть - слегка пртоможенно...
То есть, есть таблица - категории, ключевые слова - с ними рпоблем нет, создается reference и потом, в таблицу материалы - уже задаются в зависимости от референса (поля @ORM/ManyToMany/OneToMany/ManyToOne в зависимости от ситуации) . ТАк вот последняя эта таблица - обрабатывается оооооочень долго. Хоть и порционно (каждые 1000 записей flush, clear).
У кого есть еще какие идеи / опыт / итд, как ускорить этот процесссс

Pavel
22.01.2017
04:18:53
Почему dump((array)$entity) выдает такую срань http://prntscr.com/dyq483 а не нормальный массив?
Все, понял

Salavat
22.01.2017
12:13:25
Ну что, есть может у кого мысли - как 20к+ записей по-быстрому вставить :)
Есть поля,связанные с другими сущностями @ManyToMany. Так что после ->flush(), ->clear() - очень долгая обработка

Sergey
22.01.2017
12:13:51
SQL batch insert

Алексей
22.01.2017
12:14:00

Sergey
22.01.2017
12:14:02
быстрее не придумать

Salavat
22.01.2017
12:14:40
Вариант без clear работает быстро в принципе, но память съедает ацки

Sergey
22.01.2017
12:15:04

Salavat
22.01.2017
12:15:19
у меня не миграция
у меня трансформация из одной базы - в другую

Алексей
22.01.2017
12:15:28
Ты сказал, что со старой базы на новую мигрируешь.

Sergey
22.01.2017
12:15:30
миграция данных с одной структуры на другую

Google

Salavat
22.01.2017
12:15:37
а ну это да

Sergey
22.01.2017
12:15:43
ну так жахни кучку SQL

Алексей
22.01.2017
12:15:45
Ну вот и как бы зачем тебе ORM.

Sergey
22.01.2017
12:15:47
да и вообще
это одноразовая операция?

Salavat
22.01.2017
12:15:52
ну то есть самый быстрый - SQLы чистые
Да

Sergey
22.01.2017
12:15:59
ну тогда без clear сделай
и выдели пару гигов памяти
или делай с clear
и жди
20К не так много

Salavat
22.01.2017
12:16:28
с clear - 18 часов ~ получается

Алексей
22.01.2017
12:16:30
Если тебе не нужны какие-нибудь фичи ORM типа Lifecycle Callbacks или ивентов доктрины или ещё чего-то - особого смысла в доктрине при импорте данных нет.

Salavat
22.01.2017
12:16:36
Если бы ночью вчера запустил - то можно было бы

Sergey
22.01.2017
12:16:39

Salavat
22.01.2017
12:17:06
Ну вот не знаю, как-то так... Может конечно еще где-то косячу

Sergey
22.01.2017
12:17:06
это получается что всего тысяча записей в ЧАС

Алексей
22.01.2017
12:17:07
Кстати, зачем мигрировать в фикстуре - тоже вопрос, конечно.

Sergey
22.01.2017
12:17:14
это ж какая там стремная структура базы

Google

Sergey
22.01.2017
12:17:23

Salavat
22.01.2017
12:17:27
Первые три тысячи - за 15 минут :) а дальше начинается тупняк

Алексей
22.01.2017
12:17:27
Эстонская база?

Sergey
22.01.2017
12:17:30
банальный insert с вложенным SELECT

Salavat
22.01.2017
12:17:40

Sergey
22.01.2017
12:17:45
clear должен спасать

Алексей
22.01.2017
12:18:31
clear() можно делать реже. Если ты в память не упираешься, то чего дёргать-то его, если это разовая операция?
Ну и если identity map не перегружен, конечно, уже.

Sergey
22.01.2017
12:18:45
раз в пару тысяч записей делай clear

Алексей
22.01.2017
12:19:18
Я примерно так и делаю на проектах, где надо большие объёмы данных именно через доктрину пропускать. Раз в несколько тысяч итераций.

Salavat
22.01.2017
12:20:42
Если clear убирать - то получается нужно уже cascade={"persist"} указывать, таких полей 4

Sergey
22.01.2017
12:20:57
иначе повторюсь
зачем тебе доктрина вообще в проекте если ты ей по сути не пользуешься
и только страдаешь
короч я хз... мое мнение - доктрина нужна тогда когда тебе надо сделать что-то с небольшим графом сущностей (до пары сотен например)) где четко можно выделить главную
все остальное - ORM не нужна
SQL/DQL

Salavat
22.01.2017
12:22:34
В общем, спасибо, сейчас подумаю еще и либо памяти выделю, либо пойду на DQL/SQL перепишу

Google

Sergey
22.01.2017
12:22:57
проще памяти докинуть
зачем тратить время и оптимизировать одноразовую операцию

Salavat
22.01.2017
12:28:38
Спасибо. Выделю память, пойду смотреть на то, во что превратиться

finkel
22.01.2017
12:29:25
$em->getConnection()->getConfiguration()->setSQLLogger(null);

Salavat
22.01.2017
12:29:29
Так и не понял для чего multiple-transaction нужен в фикстурах. Думал что он делает один множественный инсерт

finkel
22.01.2017
12:29:41
хотя это было много лет назад

Salavat
22.01.2017
12:29:43
но не делал

Admin
ERROR: S client not available

finkel
22.01.2017
12:30:05
ибо логгер жрал память и все тупило

Salavat
22.01.2017
12:31:04
Хм

finkel
22.01.2017
12:31:09
ну я так, вспомнил, вдруг поможет

Salavat
22.01.2017
12:31:45
Надо попробовать
максимально все облегчить, что можно

Sergey
22.01.2017
13:02:59
многие любители пописать на симфони демонов на это напарываются

finkel
22.01.2017
13:05:25

Salavat
22.01.2017
13:07:36
Хм
Память перестала утекать

Google

Salavat
22.01.2017
13:13:52
400мб хватает , и почти закончилась процедура

finkel
22.01.2017
13:14:08
это без логера?

Salavat
22.01.2017
13:15:30
Да и с ноу-дебаг

Sergey
22.01.2017
13:15:48
повторюсь, потому что флашить надо монолог

Salavat
22.01.2017
13:15:50
Так что полезным оказалось. Благодарю!

Sergey
22.01.2017
13:15:53
что бы он буферы не переполнял

Salavat
22.01.2017
13:16:16

Sergey
22.01.2017
13:17:11
https://github.com/mac-cain13/daemonizable-command
рекомендую
там есть раздел про память

Salavat
22.01.2017
13:19:48
Благодарю
За час все раскидалось. Всем, кто помогал советами и мыслями, большое спасибо1

Alan
22.01.2017
17:25:25
https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html
перед импортом чтоб не перестраивало индексы каждый раз ну и разделить на транзакции пачками коммитить

Salavat
22.01.2017
19:35:37
:) doctrine так умеет делать?

Alan
22.01.2017
19:46:22
вродь оно http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly
и http://stackoverflow.com/a/9710383/3204244

Salavat
22.01.2017
19:47:35
Спасибо. Посмотрю

Sergey
22.01.2017
20:07:24
Вопрос, те кто юзают DoctrineFixtureBundle... никто не загонялся по конфигурируемым фикстурам?
ну мол... что-то типа
$this->loadFixtures([
(new ProductChatFixtures())->withHiddenChats()
]);
или лучше так не делать?)