Điểm:0

Các lần di chuyển tiếp theo mất nhiều thời gian để nhập dữ liệu đến đích

lá cờ cn

Tôi có một nhóm di chuyển khá lớn với khoảng 200 nghìn người dùng. Lần đầu tiên tôi chạy quá trình di chuyển (thông qua drush) hoặc sau khi khôi phục và bắt đầu lại, quá trình khôi phục + nhập sẽ bắt đầu ngay lập tức. Điều này có nghĩa là thanh tiến trình bắt đầu hiển thị tiến trình nhập các mục ngay lập tức.

Tôi biết không có cách nào xoay quanh quá trình di chuyển mất nhiều thời gian do số lượng mục, nhưng tôi đang gặp sự cố trong các lần chạy tiếp theo, trước khi dữ liệu thực sự bắt đầu nhập vào đích, dường như quá trình di chuyển chỉ nằm ở đó mà không làm bất cứ điều gì, trong một khoảng thời gian điên rồ. Theo các lần chạy tiếp theo, ý tôi là bất kỳ lần chạy di chuyển nào không phải là lần chạy đầu tiên hoặc lần chạy đầu tiên sau khi khôi phục. Vì vậy, một quá trình di chuyển được thực hiện để thu hút thêm người dùng hoặc được chạy sau khi lần di chuyển đầu tiên gặp lỗi.

Nếu tôi thêm --feedback=x, tôi thấy một thông báo bảng điều khiển của Đã xử lý 0 mục (0 được tạo, 0 được cập nhật, 0 không thành công, 0 bị bỏ qua) - tiếp tục với 'upgrade_d7_user' thường xuyên như vậy, vì vậy tôi biết nó phải được thực hiện thứ gì đó và cập nhật sau số mục đó, nhưng tôi không biết nó là gì. Có vẻ như chúng tôi chỉ đang đợi nó "xem xét" mọi mục trước khi xử lý nó, điều này không xảy ra trong lần chạy "ban đầu" và tôi đoán về cơ bản sẽ tăng gấp đôi thời gian chạy. Tôi đoán câu hỏi của tôi là:

  • Chính xác thì việc di chuyển thậm chí đang làm gì vào thời điểm này? Có phải nó chỉ đang thực hiện một số loại xác minh dữ liệu?
  • Có cách nào để bỏ qua bước này và chỉ cần trực tiếp xử lý dữ liệu không? Chúng tôi đã và đang tìm kiếm nhiều ngày để thực hiện lần di chuyển duy nhất này và thời gian thêm này khá mệt mỏi.
sonfd avatar
lá cờ in
Đây là quá trình di chuyển định kỳ, trong đó các lần chạy tiếp theo sẽ cập nhật các thực thể hiện có với dữ liệu mới từ nguồn?
lá cờ cn
Có và không. Hiện tại, tôi không quan tâm đến việc cập nhật các thực thể hiện có từ nguồn và không chuyển cờ cập nhật. Ngay bây giờ tôi chỉ đang cố gắng nhập các thực thể không tồn tại ở đích.
Điểm:0
lá cờ in

Tôi nghĩ điều đang xảy ra ở đây là mặc dù quá trình di chuyển đã được chạy một lần nhưng mỗi lần chạy tiếp theo sẽ kích hoạt chuẩn bịRow()hook_migrate_prepare_row() triển khai cho mọi hàng của quá trình di chuyển. Bất kể nó đã được nhập khẩu hay chưa. Thủ tục thanh toán \Drupal\migrate\Plugin\migrate\source\SourcePluginBase::next để xem điều này xảy ra ở đâu. Về cơ bản, plugin nguồn chạy một truy vấn và tạo một mảng các hàng để di chuyển. Sau đó lặp lại từng cái một và bỏ qua những cái đã được nhập khẩu. Nhưng không phải trước khi gọi lần đầu tiên triển khai hàng chuẩn bị.

Khi bạn đang di chuyển Người dùng hoặc bất kỳ loại thực thể có thể nhập trường nào, plugin nguồn (\Drupal\user\Plugin\migrate\source\d7\User trong trường hợp này) có khả năng kéo dài \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity và gọi \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity::getFields phương pháp. Nhìn thấy \Drupal\user\Plugin\migrate\source\d7\User::prepareRow Ví dụ. Điều này chạy một truy vấn, một lần cho mỗi hàng, để xem liệu thực thể nguồn có bất kỳ trường nào được liên kết với nó hay không. Và tôi đoán việc chạy truy vấn này hơn 200 nghìn lần là khá chậm. Và là nguyên nhân khiến các lần chạy tiếp theo mất nhiều thời gian.

Một cách giải quyết vấn đề này là sử dụng mực nước cao

Điều này sẽ làm là sửa đổi truy vấn mà plugin nguồn chạy để xây dựng mảng mà nó lặp lại để nó chỉ trả về các giá trị cao hơn mực nước cao. Và mảng sẽ không được điền với một loạt các hàng đã được nhập. Và các lần chạy tiếp theo sẽ nhanh hơn nhiều vì nó chỉ đang xử lý Mới hàng.

lá cờ cn
Chà, hiện tại chúng tôi đã hoàn tất quá trình di chuyển nên tôi không thể kiểm tra điều này, nhưng những gì bạn đang mô tả chắc chắn giống như giải pháp nên tôi sẽ đánh dấu là nó đã được chấp nhận. Tôi đã bắt gặp dấu hiệu nước cao một vài lần khi nghiên cứu điều này nhưng không nghĩ rằng tôi hiểu cách triển khai nó. Những liên kết là tài nguyên tốt.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.