Puncte:0

Migrațiile ulterioare durează mult timp pentru a importa date la destinație

drapel cn

Am un set destul de mare de migrare de aproximativ 200.000 de utilizatori. Prima dată când rulez migrarea (prin drush) sau după ce o rulez înapoi și o pornesc din nou, rollback-ul+import începe imediat. Prin aceasta, vreau să spun că bara de progres începe să arate progresul la importul articolelor imediat.

Știu că nu există nicio modalitate de a evita ca migrarea în sine să dureze mult timp din cauza numărului de articole, dar mă confrunt cu o problemă la rulările ulterioare în care, înainte ca datele să înceapă efectiv importarea în destinație, migrarea rămâne acolo, aparent. fără a face nimic, pentru o perioadă nebună de timp. Prin rulări ulterioare, mă refer la orice rulare a migrației care nu este prima rulare sau prima rulare după o derulare înapoi. Deci, o migrare care este executată fie pentru a atrage utilizatori suplimentari, fie este rulată după ce cea inițială lovește o eroare.

Dacă adaug --feedback=x, văd un mesaj de consolă de S-au procesat 0 articole (0 create, 0 actualizate, 0 eșuate, 0 ignorate) - continuând cu „upgrade_d7_user” din când în când, așa că știu că trebuie să fie ceva și actualizarea după acel număr de articole, dar nu știu ce este. Se pare că abia așteptăm să „arută o privire” la fiecare articol înainte de a-l procesa, ceea ce nu se întâmplă la o rulare „inițială” și cred că practic dublează cât de mult va dura rularea. Presupun că întrebările mele sunt:

  • Ce face mai exact migrația în acest moment? Face doar un fel de verificare a datelor?
  • Există vreo modalitate de a ocoli acest pas și de a trece direct la procesarea datelor în sine? Căutăm deja și zile pentru a rula această migrare unică, iar acest timp suplimentar este destul de debilitant.
sonfd avatar
drapel in
Aceasta este o migrare recurentă, în care rulările ulterioare ar trebui să actualizeze entitățile existente cu date noi din sursă?
drapel cn
Da și nu. Momentan, nu sunt preocupat de actualizarea entităților existente din sursă și nu trec indicatorul de actualizare. În acest moment încerc doar să import entități care nu există pe destinație.
Puncte:0
drapel in

Cred că ceea ce se întâmplă aici este că, deși migrarea a fost deja rulată o dată, fiecare rulare ulterioară va declanșa prepareRow() și hook_migrate_prepare_row() implementări pentru fiecare rând al migrației. Indiferent dacă a fost deja importat sau nu. Verifică \Drupal\migrate\Plugin\migrate\source\SourcePluginBase::next pentru a vedea unde se întâmplă asta. Practic, pluginul sursă rulează o interogare și construiește o serie de rânduri pentru a migra. Apoi repetă peste fiecare și sarituri cele care au fost deja importate. Dar nu înainte de a apela mai întâi implementările de rânduri de pregătire.

Când migrați utilizatori sau orice tip de entitate care poate fi câmpată, pluginul sursă (\Drupal\user\Plugin\migrate\source\d7\User în acest caz) probabil se extinde \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity și îl sună pe \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity::getFields metodă. Vedea \Drupal\user\Plugin\migrate\source\d7\User::prepareRow de exemplu. Aceasta rulează o interogare, o dată pentru fiecare rând, pentru a vedea dacă entitatea sursă are câmpuri asociate cu aceasta. Și presupun că rularea acestei interogări de peste 200.000 de ori este destul de lentă. Și este ceea ce face ca rulările ulterioare să dureze mult.

O modalitate de a evita acest lucru este să folosiți un nivel de apă ridicat

Ceea ce va face aceasta este să modifice interogarea pe care o rulează pluginul sursă pentru a construi matricea pe care o trece în buclă, astfel încât să returneze doar valorile care sunt peste limita maximă. Și matricea nu va fi populată cu o grămadă de rânduri care au fost deja importate. Și rulările ulterioare ar trebui să fie mult mai rapide, deoarece este doar procesare nou rânduri.

drapel cn
Ei bine, acum am terminat cu migrarea, așa că nu pot testa acest lucru, dar ceea ce descrii cu siguranță sună ca soluția, așa că o voi marca ca acceptată. Am dat peste semne highwater de câteva ori în timp ce cercetam acest lucru, dar nu cred că am înțeles cum să le implementez. Acele link-uri sunt resurse bune.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.