2011-09-06 308 views
6

我有large datasets數以百萬計的XML格式的記錄。這些數據集是數據庫的完整數據轉儲,直到某個時間點。如何確定兩個大型數據集之間的差異?

兩次轉儲之間可能已添加新條目,而現有條目可能已被修改或刪除。假設架構保持不變,並且每個條目都有一個唯一的ID。

確定這些數據集中的兩個(包括刪除和更新)之間的增量的最佳方法是什麼?


我的計劃是將所有內容加載到RDBMS並從那裏開始。

首先,加載較舊的轉儲。然後,將較新的轉儲加載到不同的模式中,但這樣做時我將檢查該條目是新的還是對現有條目的更新。 如果是,我將在一個稱爲「更改」的新表上記錄標識。

在這一切都完成後,我會去通過老轉儲通過所有條目去,看看他們是否有匹配的記錄:在新的轉儲(即相同的ID)。如果不是,請登錄到更改。

假設通過ID查找記錄是O(log n)操作,這應該允許我在O(n log n)時間內完成所有操作。

因爲我能確定通過查看是否存在只有ID和最後修改日期記錄的區別,我也可以加載在主內存中的一切,以及。時間複雜度將是相同的,但有更少的磁盤I/O帶來的額外好處,這應該使這個速度提高几個數量級。

對此提出建議? (注:這更多的是比任何性能問題)

+0

「因爲我可以確定...哪個應該使這個更快的數量級」。 「這不僅僅是一個表現問題」。 ...所以在記憶中這樣做會更快,而且你主要關心的是性能。聽起來像你回答了你自己的問題。 – Gerrat

回答

0

作爲一個不尋常的建議,可以考慮使用git這一點。將第一個數據集置於版本控制之下,然後清理工作目錄並複製第二個數據集。 git快速提升差異。

+0

如果記錄沒有特定的順序(即:訂單不保證保持不變),可以處理該問題嗎? – NullUserException

+0

@NullUserException:git在文件結構上工作。如果你正在討論堆棧溢出導出,你可以將每個問題XML存儲在一個文件questionid.xml中(不確定,從來沒有詳細看過導出。) – Andomar

+0

所有的問題都在同一個XML文件中。真的想避免創建數百萬個XML文件... – NullUserException

0

看看MSDN上的這篇文章,它提供了獲取兩個DataTable之間差異的解決方案。它應該指向你在正確的方向:

如何比較兩個數據表:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/23703a85-20c7-4759-806a-fabf4e9f5be6

你可能也想看看這太問題太:
Compare two DataTables to determine rows in one but not the other

我已經也看到了這種方法用了幾次:

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

我知道該怎麼做,我更關心這樣的查詢的性能。 – NullUserException

+0

@Null標題詢問如何確定差異,而不是如何快速完成。此外,它看起來像你想創建一個循環,這將是不好的。 –

+0

你如何建議我加載沒有循環的數據? – NullUserException

1

看看DeltaXML。

(填充,因爲StackOverflow不允許簡短的回答)