2010-07-05 59 views
0

我在數據庫中有將近100,000條記錄,我需要使用Longest Common Subsequence算法將它們與其他對象進行比較,並且我需要每天使用1000條新記錄進行比較。 我的應用程序是用c#.Net編寫的,問題是這個比較在應用程序級別上運行緩慢,因爲比較1000個記錄需要超過10個小時。 因此,有誰知道如果我在SQL中的存儲過程中編寫此算法,會有多快?或者有其他方法嗎?任何處理大量數據的好方法?

+0

是一百還是十萬? – 2010-07-05 07:00:06

+0

用於比較1000條記錄是否需要10個多小時?你的算法肯定有問題,存儲過程不會對你有很大的幫助。 – 2010-07-05 07:08:09

+0

現在有100.000,但在一年內會有幾百萬條記錄。 而在比較中,我用LCS算法比較了六個字符串(書寫的行,如代碼和全名),並將它們從西里爾文轉換爲拉丁文。 而我的意思是與其他100.000 – Pece 2010-07-05 07:23:54

回答

0

其確實存儲過程比LinQ或View更快。這就是快速收集數據的方法。

+0

僅當您以乾淨和正確的方式編寫存儲過程時,我確信有些開發人員能夠編寫將執行非常糟糕的存儲過程。所以說SP總是更快是不正確的,它可以更快(如果由一個好的開發人員完成)。 – Gertjan 2010-07-05 08:54:18

+0

例如:與linq你可以使用條件,但它會再次獲取所有數據,並收集具體取決於你的條件。你是可靠的,編寫存儲過程時需要清楚。如果你寫的條件正確,SP會更快。 – 2010-07-05 08:58:12

3

如果您只有100.000條記錄。只需在應用程序啓動時收集所有內容。在內存中執行算法,並在完成時將任何結果/修改存儲到數據庫中。

這將是快得多

+0

即使記錄太大而無法一次裝入內存,比如說每個記錄一兆字節,加載一個子集(比如500)並在該批處理上運行LCS算法,記下最佳答案,然後繼續下一批的500條記錄可能仍然比迭代每個輸入字符串的整個100,000更好。 – sarnold 2010-07-05 07:14:35

1

我不知道TSQL將讓你同樣的靈活性,C#允許你,尤其是當你處理像LCS複雜的算法。將所有需要的記錄存儲在內存中並從那裏處理它們。

現在最重要的事情是,你能想到開箱的一分鐘,去其他的方式,嘗試插入標記某種一旦新項目被插入的(排名)。沒有人可以在這裏建議你,因爲你沒有提供一點數據,你在做什麼以及你在比較什麼。可能您可以在新項目插入期間輕鬆進行一些排名。我並不是說一旦添加新項目就可以進行全面比較,但是如果每小時左右觸發一次事件,則無需用戶輸入即可更新表格。

4

你可能會想嘗試和C#編寫存儲的過程,如果你使用的是SQL Server 2005或2008年,你得到越來越多的記錄,這可能會擴大,從長遠來看更好,不能讓他們全部在內存中。

查看MSDN Introduction to SQL Server CLR Integration

這將使用你的數據庫服務器上更多的CPU,但你不必將數據傳輸來回。

0

你如何確定兩個您的記錄彼此(即它們是一個子序列的一部分)遵循?也許你不需要比較每條記錄的整個1MB,只需分析一部分內容就可以加快速度。

的聲音,我喜歡你的算法的缺陷,或者一個DB可能不是存儲你的數據,如果它採取2秒比較每個記錄的最好方法?

+0

我使用Longest Common Subsequence算法將新插入的字符串與數據庫中的所有其他字符串進行比較。 – Pece 2010-07-05 07:37:33