2011-09-06 37 views
6

Tôi có large datasets với hàng triệu bản ghi ở định dạng XML. Các bộ dữ liệu này là các bãi dữ liệu đầy đủ của một cơ sở dữ liệu đến một thời điểm nhất định.Làm cách nào để xác định sự khác biệt giữa hai tập dữ liệu lớn?

Giữa hai bãi mục mới có thể đã được thêm vào và các mục hiện có có thể đã được sửa đổi hoặc xóa. Giả sử lược đồ vẫn không thay đổi và mọi mục nhập đều có một ID duy nhất.

Cách tốt nhất để xác định delta giữa hai bộ dữ liệu này (bao gồm xóa và cập nhật) là gì?


Kế hoạch của tôi là tải mọi thứ vào RDBMS và đi từ đó.

Trước tiên, tải bãi chứa cũ hơn. Sau đó, tải dump mới hơn vào một lược đồ khác, nhưng khi làm như vậy, tôi sẽ kiểm tra xem mục nhập là mới hay là một bản cập nhật cho một mục nhập hiện có. Nếu có, tôi sẽ ghi lại ID trên một (các) bảng mới được gọi là "thay đổi".

Sau khi hoàn tất, tôi sẽ đi qua bãi chứa cũ đi qua tất cả các mục và xem liệu chúng có bản ghi trùng khớp (ví dụ: cùng một ID) trên bãi chứa mới hay không. Nếu không, hãy đăng nhập vào các thay đổi.

Giả sử tìm kiếm bản ghi bằng ID là hoạt động O(log n), điều này sẽ cho phép tôi thực hiện mọi thứ trong thời gian O(n log n).

Bởi vì tôi có thể xác định sự khác biệt bằng cách nhìn vào sự hiện diện hoặc vắng mặt của bản ghi chỉ với ID và ngày sửa đổi cuối cùng, tôi cũng có thể tải mọi thứ trong bộ nhớ chính. Độ phức tạp của thời gian sẽ giống nhau, nhưng với lợi ích bổ sung của I/O đĩa ít hơn, điều này sẽ làm cho điều này nhanh hơn theo thứ tự độ lớn.

Đề xuất? (Lưu ý: Đây là câu hỏi về hiệu suất nhiều hơn bất kỳ điều gì)

+0

"Vì tôi có thể xác định ... nên làm điều này nhanh hơn theo thứ tự độ lớn". "Đây là một câu hỏi về hiệu năng hơn bất cứ điều gì". ...sooo làm điều này trong bộ nhớ sẽ nhanh hơn nhiều và bạn chủ yếu quan tâm đến hiệu suất. Có vẻ như bạn đã trả lời câu hỏi của riêng bạn. – Gerrat

Trả lời

0

Như một đề xuất khác thường, hãy xem xét sử dụng git cho việc này. Mang theo tập dữ liệu đầu tiên trong điều khiển phiên bản, sau đó xóa thư mục làm việc của bạn và sao chép trong tập dữ liệu thứ hai. git nhanh chóng gây ra sự khác biệt.

+0

Có thể git xử lý rằng nếu các hồ sơ không theo thứ tự cụ thể (ví dụ: lệnh không được bảo đảm để giữ nguyên)? – NullUserException

+0

@NullUserException: git hoạt động trên cấu trúc tệp. Nếu bạn đang nói về việc xuất tràn ngăn xếp, bạn có thể lưu trữ mỗi câu hỏi XML trong một tập tin questionid.xml (không chắc chắn, không bao giờ xem chi tiết xuất khẩu.) – Andomar

+0

Tất cả các câu hỏi đều nằm trong cùng một tệp XML ... Tôi thực sự muốn tránh tạo ra hàng triệu tệp xml ... – NullUserException

0

Hãy xem bài đăng này trên MSDN, cung cấp giải pháp để nhận sự khác biệt giữa hai DataTables. Nó nên chỉ cho bạn đi đúng hướng:

Làm thế nào để so sánh hai DataTables:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/23703a85-20c7-4759-806a-fabf4e9f5be6

Bạn cũng có thể muốn xem xét này SO câu hỏi quá:
Compare two DataTables to determine rows in one but not the other

Tôi đã cũng thấy phương pháp này sử dụng một vài lần:

table1.Merge(table2); 
DataTable changesTable = table1.GetChanges(); 
0
select 
    coalesce(a.id, b.id) as id, 
    case 
     when a.id is null then 'included' 
     when b.id is null then 'deleted' 
     when a.col != b.col then 'updated' 
    end as status 
from a 
full outer join b on a.id = b.id 
where a.id is null or b.id is null or a.col != b.col 
+0

Tôi biết làm thế nào để làm điều đó, tôi quan tâm nhiều hơn về hiệu suất của một truy vấn như thế này. – NullUserException

+0

@Null Tiêu đề yêu cầu cách xác định sự khác biệt không phải cách thực hiện nhanh. Ngoài ra, có vẻ như bạn muốn tạo một vòng lặp và điều đó sẽ rất tệ. –

+0

Làm thế nào để bạn đề xuất tôi tải dữ liệu mà không có vòng lặp? – NullUserException

1

Nhìn vào DeltaXML.

(được đệm vì StackOverflow không cho phép câu trả lời ngắn)

Các vấn đề liên quan