Nhập nguồn dữ liệu tệp phẳng lớn với Drupal 7 với tích hợp Lượt xem 3


13

Mục tiêu của tôi là tạo ra một phương pháp nhanh, đáng tin cậy và tự động để truy cập dữ liệu chỉ đọc có trong một số nguồn dữ liệu tệp phẳng rất lớn (tài liệu CSV , Độ rộng cố định và tài liệu XML) bằng cách sử dụng Drupal 7 có thể được truy vấn bằng cách sử dụng Chế độ xem 3 mô-đun. Tôi muốn sử dụng các mô-đun đã có sẵn, nhưng xây dựng một mô-đun tùy chỉnh cũng là một tùy chọn.

Để giúp loại trừ các mô-đun và phương thức không phù hợp với tác vụ, đây là số liệu thống kê về các tệp tôi đang làm việc với:

  • Nhập hàng năm: 8.500.000 tệp CSV dòng . (Được thanh lọc và tải lại hàng năm. Có khóa chính.)
  • Nhập hàng tuần: 350.000 dòng tệp cố định chiều rộng. (Được thanh lọc và tải lại hàng tuần. Không có khóa chính .)
  • Nhập hàng giờ: tệp CSV 3.400 . (Muốn cập nhật và đồng bộ hóa thường xuyên nhất có thể, nhưng không quá 20 phút một lần. Có khóa chính)
  • Nhập hàng ngày: 200 tệp XML. (Được thanh lọc và tải lại hàng ngày. Có khóa chính)

Chuyển đổi giữa ba định dạng không phải là một vấn đề và có thể được thực hiện nếu nó sẽ cải thiện hiệu suất nhập hoặc cho phép các công cụ tốt hơn được cung cấp. ( AWK cho Chiều rộng cố định đến CSV , v.v.) Tự động truy xuất và chuyển đổi dễ dàng thông qua các tập lệnh cron và sh , nhưng vẫn cần tự động hóa tích hợp Drupal 7. Việc sử dụng các bảng tùy chỉnh cũng có thể miễn là người vews có thể tham chiếu dữ liệu bằng các mối quan hệ.

Điều gì sẽ là cách thực hành tốt nhất để thực hiện loại tích hợp dữ liệu này với Drupal 7? Ngoài ra, tôi có để lại bất kỳ chi tiết quan trọng nào liên quan đến dữ liệu hay những gì tôi đang cố gắng thực hiện không?


Dưới đây là một vài dự án tôi hiện đang tìm kiếm để tìm giải pháp. Tôi muốn mở rộng về điều này để giúp những người khác quyết định tuyến đường nào sẽ thực hiện khi làm việc với nhập dữ liệu lớn hơn.

Nhập dữ liệu vào các nút:

Nguồn cấp dữ liệu sẽ nhập dữ liệu đáng tin cậy. Tốc độ là hợp lý cho các nguồn dữ liệu nhỏ hơn nhưng quá chậm đối với các bảng 300k +.

Tự động hóa có sẵn bằng cron và Bộ lập lịch công việc (Hiện tại Alpha cho D7).

Không có chỉ mục hoặc khóa duy nhất có sẵn trong dữ liệu nguồn sẽ khiến việc này trở nên khó sử dụng. Nó nhanh hơn nguồn cấp dữ liệu, nhưng vẫn chậm để nhập các bảng rất lớn.

Tự động hóa có sẵn thông qua drush và cron.

Bảng tùy chỉnh thay vì nút

Các mô-đun liệu trông rất hứa hẹn, nhưng là rất buggy cho D7 vào lúc này. Các yêu cầu tự động hóa và tốc độ nhập sẽ dễ dàng được đáp ứng bằng cách sử dụng dữ liệu, nhưng độ tin cậy còn thiếu. Việc tích hợp lượt xem (liên kết dành cho D6) có vẻ rất hứa hẹn.

Đã thêm cái này để tham khảo. Không có ứng cử viên D7 tại thời điểm này, nhưng có thể đóng vai trò là điểm khởi đầu cho một mô-đun tùy chỉnh.

Đã thêm cái này để tham khảo. Điều này dường như đã được Table Wizard hấp thụ trong Drupal 6. Một lần nữa, chỉ được thêm vào để tham khảo.

Có vẻ như yêu cầu Trình hướng dẫn bảng (chỉ D6) để tích hợp Lượt xem . Đã thêm để tham khảo, nhưng không đáp ứng yêu cầu Lượt xem.


@MPD - Đã thêm "Bảng tùy chỉnh" dưới dạng giải pháp có thể và các mô-đun mở rộng. Cảm ơn bạn đã bổ sung.

Câu trả lời:


8

Chú ruột của tôi nói với tôi rằng kế hoạch này sẽ khiến máy chủ của bạn bốc cháy ...

Nghiêm túc mà nói, nếu bạn đang sử dụng nhiều dữ liệu đó, thì tôi nghĩ bạn cần giữ dữ liệu đó trong một nguồn dữ liệu bên ngoài và sau đó tích hợp nó với Drupal.

Suy nghĩ ban đầu của tôi sẽ sử dụng hai cơ sở dữ liệu cho dữ liệu ngoài, để bạn có thể thực hiện nhập hàng tuần mà không làm phiền quá nhiều thứ. Nói cách khác, khởi động cơ sở dữ liệu A và sau đó nhập vào B. Khi quá trình nhập được thực hiện, hãy tạo B thành nguồn trực tiếp. Sau đó lau và nhập vào A.

Tôi đã thực hiện rất nhiều việc tích hợp các nguồn dữ liệu bên ngoài vào Drupal và điều đó thực sự không khó lắm. Tôi đã đưa ra một cái nhìn tổng quan trong kế hoạch chuyển đổi cho sự ghê tởm PHP5 sang Drupal . Đó là cho Drupal 6, nhưng điều tương tự về cơ bản áp dụng cho Drupal 7. Về cơ bản, bạn mô phỏng những gì CCK / API API làm với giao diện của riêng bạn.

Mặc dù vậy, không có UUID cho cơ sở dữ liệu hàng tuần thực sự ném cờ lê trong công trình. Phần đó đòi hỏi rất nhiều mặc dù, nhiều hơn nữa có thể được cung cấp trong một diễn đàn Q / A như thế này.

Nếu bạn thực sự muốn đi theo con đường nhập khẩu, tôi sẽ bảo lãnh cho Nguồn cấp dữ liệu và Di chuyển và viết tập lệnh nhập của riêng bạn. Về cơ bản, bạn thực hiện quy trình bookstrap ban đầu từ index.php, truy vấn nguồn dữ liệu của bạn, tạo các nút của bạn và sau đó lưu chúng. Lập trình làm cho các nút là dễ dàng.

Cách tốt nhất để bắt đầu với điều này là tạo một nút với UI, sau đó print_r nó và sao chép đối tượng bằng mã trong tập lệnh nhập của bạn. Phân loại, tệp và nốt, là những phần khó, nhưng bạn chỉ cần làm quen với các phần này của API để xây dựng các thuộc tính đối tượng này. Khi bạn có một đối tượng nút hợp lệ, thì bạn chỉ có thể thực hiện một nút_save (). Đảm bảo bạn đặt giới hạn rất lớn với set_time_limit () để tập lệnh của bạn chạy.

CHỈNH SỬA DƯỚI ĐỂ ĐỊA CHỈ / MỞ RỘNG:

Cá nhân, chúng tôi đã ngừng sử dụng mô-đun tiếp cận dựa trên mô-đun để nhập dữ liệu một thời gian trước đây. Họ làm việc chủ yếu là tốt, nhưng cuối cùng chúng tôi đã dành quá nhiều thời gian để chiến đấu với họ và quyết định chi phí / lợi ích quá thấp.

Nếu bạn thực sự cần dữ liệu trong Drupal thích hợp, thì ý kiến ​​của tôi về tập lệnh nhập tùy chỉnh đã không thay đổi. Một trong các mô-đun bạn tham chiếu có thể được sử dụng làm điểm bắt đầu để xây dựng các đối tượng nút, sau đó chỉ cần lặp qua các nút xây dựng dữ liệu của bạn và lưu chúng. Nếu bạn có PK, bạn có thể dễ dàng thêm logic để tìm kiếm cơ sở dữ liệu và node_load (), sửa đổi và lưu. Một tập lệnh nhập thực sự chỉ hoạt động trong vài giờ nếu bạn biết API Drupal.

Nếu tích hợp lượt xem là một khóa (và có vẻ như nó dựa trên chỉnh sửa) và bạn muốn thực hiện cách tiếp cận bảng bên ngoài, thì tùy chọn tốt nhất của bạn là thực hiện một mô-đun tùy chỉnh và triển khai hook_view_data để đưa dữ liệu của bạn vào chế độ xem. Nhiều khả năng, dù sao bạn cũng sẽ tùy chỉnh mô-đun để hỗ trợ nguồn dữ liệu của mình, vì vậy việc thêm hook này không nên làm việc nhiều hơn thế. Các mô-đun TW và Dữ liệu nên có một số ví dụ để giúp bạn đi.

Cá nhân, mặc dù, tôi chưa bao giờ thấy việc tích hợp lượt xem với dữ liệu bên ngoài là thực sự đáng giá. Trong trường hợp tôi đã xem xét nó, dữ liệu quá "khác biệt" để hoạt động tốt với cách tiếp cận dựa trên quan điểm. Tôi chỉ kết thúc bằng cách sử dụng phương pháp mà tôi đã mô tả trong liên kết "gớm ghiếc" ở trên.


Bạn đã đưa ra ba điểm xuất sắc và tôi sẽ điều chỉnh câu hỏi của mình cho phù hợp. Nhập khẩu và xuất khẩu hàng loạt sẽ tốt nhưng khi nhập hàng trăm nghìn, hoặc có thể hàng triệu nút tại thời điểm này có vẻ tốt nhất, không thực tế. Các bảng tùy chỉnh cũng có thể rất hữu dụng nếu chúng có thể được tích hợp với các khung nhìn. Cảm ơn bạn đã phản hồi @MPD.
Citricguy

2

Tôi nghĩ rằng một cách tiếp cận dựa trên nút (hoặc thậm chí dựa trên thực thể) sẽ đốt cháy máy chủ của bạn với hàng triệu nút. Ngoài ra, nhìn vào quá trình nhập hàng giờ của bạn, điều đó có nghĩa là bạn sẽ tạo một nút_save () ít nhất một lần một giây. Đó là quá nhiều cho Drupal và gây ra một vấn đề hiệu suất.

Lý do đằng sau đó là vì những nội dung đó, bạn sẽ không cần bất kỳ cơ chế hook nào, bạn sẽ không cần pathauto (nhưng bạn có thể tự tạo bí danh, nó rẻ hơn nhiều so với pathauto), bạn sẽ không cần các trường ... Viết một truy vấn "INSERT" đơn giản nhanh hơn 100 lần so với node_save () hoặc entity_save ().

1 / IMHO tùy chọn tốt nhất là bảng tùy chỉnh và mô-đun tùy chỉnh để nhập dữ liệu của bạn, sau đó viết trình xử lý Lượt xem để tích hợp Drupal.

2 / Bộ đệm cơ sở dữ liệu bị vô hiệu trong quá trình nhập hàng giờ. Nếu mất quá nhiều thời gian, bạn có thể nghĩ về một bản sao. Ở dạng dễ nhất, tạo hai bảng giống hệt nhau, sử dụng bảng đầu tiên, nhập vào bảng thứ hai, chuyển cấu hình Drupal của bạn sang sử dụng bảng thứ hai, đồng bộ hóa bảng thứ 2 thành bảng thứ nhất (sau đó tùy chọn chuyển về bảng thứ nhất). Một giải pháp khác là trong tập lệnh nhập tùy chỉnh của bạn, chuẩn bị và nhóm các truy vấn INSERT / UPDATE, sau đó chỉ gửi nó ở cuối trong một giao dịch để giảm thời gian ghi cơ sở dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.