Score:0

การย้ายข้อมูลในครั้งต่อไปใช้เวลานานในการนำเข้าข้อมูลไปยังปลายทาง

ธง cn

ฉันมีชุดการย้ายที่ค่อนข้างใหญ่ซึ่งมีผู้ใช้ประมาณ 200,000 คน ครั้งแรกที่ฉันเรียกใช้การย้ายข้อมูล (ผ่าน drush) หรือหลังจากย้อนกลับและเริ่มใหม่อีกครั้ง การย้อนกลับ+นำเข้าจะเริ่มขึ้นทันที จากนี้ฉันหมายความว่าแถบความคืบหน้าเริ่มแสดงความคืบหน้าในการนำเข้ารายการทันที

ฉันรู้ว่าไม่มีทางที่การย้ายข้อมูลจะใช้เวลานานเนื่องจากจำนวนรายการ แต่ฉันพบปัญหาในการเรียกใช้ครั้งต่อๆ ไป ซึ่งก่อนที่ข้อมูลจะเริ่มนำเข้าไปยังปลายทางจริงๆ การย้ายข้อมูลจะอยู่ที่นั่น ดูเหมือนว่า โดยไม่ทำอะไรเลยเป็นระยะเวลาที่บ้าคลั่ง ในการเรียกใช้ครั้งต่อไป ฉันหมายถึงการดำเนินการย้ายข้อมูลใดๆ ที่ไม่ใช่การเรียกใช้ครั้งแรก หรือการเรียกใช้ครั้งแรกหลังจากการย้อนกลับ ดังนั้น การโอนย้ายที่ดำเนินการเพื่อดึงผู้ใช้เพิ่มเติมหรือเรียกใช้หลังจากที่รายการแรกพบข้อผิดพลาด

ถ้าฉันเพิ่ม --ข้อเสนอแนะ=xฉันเห็นข้อความคอนโซลของ ประมวลผล 0 รายการ (สร้าง 0 รายการ อัปเดต 0 รายการ ล้มเหลว 0 รายการ ละเว้น 0 รายการ) - ดำเนินการต่อด้วย 'upgrade_d7_user' บ่อย ๆ ฉันรู้ว่ามันต้องทำ บางสิ่งบางอย่าง และอัพเดทหลังจากนั้นหลายรายการแต่ไม่รู้ว่าคืออะไร ดูเหมือนว่าเรากำลังรอให้ "ตรวจสอบ" ทุกรายการก่อนที่จะประมวลผล ซึ่งจะไม่เกิดขึ้นในการเรียกใช้ "เริ่มต้น" และฉันเดาว่าโดยพื้นฐานแล้วจะใช้เวลาวิ่งนานขึ้นเป็นสองเท่า ฉันเดาว่าคำถามของฉันคือ:

  • การโยกย้ายกำลังทำอะไรกันแน่ ณ จุดนี้ เป็นเพียงการตรวจสอบข้อมูลบางอย่างหรือไม่?
  • มีวิธีใดบ้างที่จะข้ามขั้นตอนนี้และข้ามไปที่การประมวลผลข้อมูลโดยตรง เรากำลังมองหาและวันที่จะเรียกใช้การย้ายข้อมูลครั้งเดียวนี้ และเวลาที่เพิ่มขึ้นมานี้ค่อนข้างจะทำให้ร่างกายทรุดโทรมลง
sonfd avatar
in flag
นี่เป็นการย้ายที่เกิดซ้ำ ซึ่งการรันที่ตามมาควรอัปเดตเอนทิตีที่มีอยู่ด้วยข้อมูลใหม่จากแหล่งที่มา
cn flag
ใช่และไม่. ในขณะนี้ ฉันไม่กังวลกับการอัปเดตเอนทิตีที่มีอยู่จากแหล่งที่มา และไม่ได้ส่งผ่านการตั้งค่าสถานะการอัปเดต ตอนนี้ฉันแค่พยายามนำเข้าเอนทิตีที่ไม่มีอยู่ในปลายทาง
Score:0
ธง in

ฉันคิดว่าสิ่งที่เกิดขึ้นที่นี่คือแม้ว่าการย้ายข้อมูลจะถูกเรียกใช้ไปแล้วหนึ่งครั้ง แต่การเรียกใช้ครั้งต่อไปแต่ละครั้งจะทริกเกอร์ เตรียมแถว () และ hook_migrate_prepare_row() การใช้งานสำหรับทุกแถวของการโยกย้าย ไม่ว่าจะนำเข้ามาแล้วหรือไม่ก็ตาม เช็คเอาท์ \Drupal\migrate\Plugin\migrate\source\SourcePluginBase::ถัดไป เพื่อดูว่าสิ่งนี้เกิดขึ้นที่ไหน โดยพื้นฐานแล้ว ปลั๊กอินต้นทางจะเรียกใช้คิวรีและสร้างอาร์เรย์ของแถวเพื่อย้ายข้อมูล จากนั้นวนซ้ำแต่ละรายการและ ข้าม ที่เคยนำเข้ามาแล้ว แต่ไม่ใช่ก่อนที่จะเรียกการเตรียมการใช้งานแถวก่อน

เมื่อคุณย้ายผู้ใช้หรือเอนทิตีฟิลด์ประเภทใดก็ตาม ปลั๊กอินต้นทาง (\Drupal\user\Plugin\migrate\source\d7\User ในกรณีนี้) มีแนวโน้มที่จะขยายออกไป \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity และโทร \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity::getFields กระบวนการ. ดู \Drupal\user\Plugin\migrate\source\d7\User::prepareRow ตัวอย่างเช่น. ซึ่งจะเรียกใช้คิวรี 1 ครั้งสำหรับทุกแถว เพื่อดูว่าเอนทิตีต้นทางมีฟิลด์ใดๆ ที่เกี่ยวข้องหรือไม่ และฉันเดาว่าการเรียกใช้แบบสอบถามนี้มากกว่า 200,000 ครั้งค่อนข้างช้า และเป็นสาเหตุให้การวิ่งครั้งต่อไปใช้เวลานาน

วิธีหนึ่งในการแก้ปัญหานี้คือการใช้เครื่องหมายน้ำสูง

สิ่งนี้จะทำคือแก้ไขแบบสอบถามที่ปลั๊กอินต้นทางเรียกใช้เพื่อสร้างอาร์เรย์ที่มันวนซ้ำเพื่อให้ส่งคืนค่าที่อยู่เหนือเครื่องหมายน้ำสูงเท่านั้น และอาร์เรย์จะไม่ได้รับการเติมข้อมูลด้วยแถวจำนวนมากที่ถูกนำเข้าแล้ว และการรันที่ตามมาควรเร็วกว่ามากเพราะเป็นเพียงการประมวลผลเท่านั้น ใหม่ แถว

cn flag
ตอนนี้เราทำการย้ายข้อมูลเสร็จแล้ว ดังนั้นฉันจึงไม่สามารถทดสอบสิ่งนี้ได้ แต่สิ่งที่คุณอธิบายดูเหมือนจะเป็นวิธีแก้ปัญหาอย่างแน่นอน ดังนั้นฉันจะทำเครื่องหมายว่ายอมรับแล้ว ฉันเจอเครื่องหมาย highwater สองสามครั้งในขณะที่ค้นคว้าสิ่งนี้ แต่ไม่คิดว่าฉันเข้าใจวิธีการนำไปใช้ ลิงค์เหล่านั้นเป็นแหล่งข้อมูลที่ดี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา