2012-04-09 31 views
1

數據庫是一種合理的記憶數據結構嗎?當需要高速緩存大量數據時,普通的軟件可能無法將其積極地保存在內存中。數據庫可以很容易地存儲計算結果供以後使用,這意味着計算可以在任何時候停止並開始,而不會影響程序的進度。如果數據庫是共享的,處理也可以分佈在多個系統(計算機集羣)之間。數據庫記憶?

我唯一的預留是查詢數據庫引起的延遲可能會影響算法的性能,特別是如果一個算法非常快速地處理許多排列。當然,如果算法/應用程序的空間複雜度非常高(千兆字節),數據庫記憶只是必要的。有什麼想法嗎?

+1

取決於您的要求 – 2012-04-09 23:43:21

+0

顧名思義:memoization是一種優化技術,主要用於通過函數調用來加速計算機程序,避免重複計算以前處理的輸入的結果 – 2012-04-09 23:43:42

+1

是的,你已經知道了。爲了獲得價值,檢索(和存儲)的成本需要大大低於重新計算的成本。 – RBarryYoung 2012-04-09 23:43:59

回答

3

如果您擔心大型數據需要在單臺機器上進行回答,那麼答案几乎肯定是不!而在現代硬件上,如果答案不是否定的,那麼要麼有計算模式,要麼計算應該被認爲是不可行的。但是有幾個變化可以使它有意義。

與memoization的勝利是重新計算的成本超過獲取您以前的答案。但是,如果你的答案適合於RAM,那麼使用數據庫就沒有勝利,因爲將存儲保存在內存中會更快。所以數據庫唯一有趣的例子是答案不適合RAM的地方。

讓我們假設,爲了論證,每個鍵/值對需要高達640個字節。讓我們假設你有64GB的RAM可用。因此,爲了使其不適合內存,您需要超過1億個事實,這些事實是隨機創建/訪問的。但是,讓我們考慮實際的硬件。這些事實,當它們不適合RAM時,將存儲在硬盤中。硬盤驅動器旋轉,例如,6k RPM,或每秒100次。這使得有時間取出/存儲一個平均1/200秒的隨機數據(平均來說,你必須旋轉一半才能找到你的數據)。因此,在填充數據結構後,再次隨機訪問它需要1億次* 0.005秒= 500,000秒,這接近590天。我們需要花費數年的時間才能訪問數據(更不用說創建它),這些數據正在接近硬件故障之間的平均時間。 (順便說一句,我們可以利用這裏的一些並行性,硬盤驅動器一次尋找他們正在尋找的磁盤扇區,但這是有限的,並不會節省您)。

道德是隨機訪問磁盤上的大型數據集是不可行的。即使你把數據庫放在它的前面。硬盤不是RAM,不應該這樣想。

但一切都不會丟失。

數據庫有意義的場景是您對分佈式計算的建議。如果你的計算步驟很昂貴,memoized調用相對較少,並且數據可以放在內存中,那麼數據庫非常方便。對數據庫的調用將會很快(事物在內存中),你不能簡單地把東西放在本地硬盤上(你的數據分佈在多臺機器上以使用CPU,所以沒有共享硬盤)和數據庫可能很方便,因爲它在那裏。 (我以前用這種方式使用數據庫,並且非常高興。)

但是在這種情況下,數據庫只是一個鍵/值存儲。在SQL數據庫工作時,您可能需要考慮不使用SQL解決方案。而一旦你選擇了沒有SQL的解決方案,你可以選擇數據存儲的地方,不管你有多少數據,數據都被分割,這樣所有數據都可以放入RAM中。 (是的,你也可以分解關係型數據庫eBay是我知道的公司的一個很好的例子,但是一旦你做了,你往往會失去它的「關係」部分。是的,我知道有幾家公司聲稱,他們的要求有重大警告。)

實際上,當您執行Google搜索時,您正針對這種分片數據存儲運行,其中包含基本上被記憶的關於哪些頁面與哪些關鍵字匹配以及哪些頁面匹配的許多問題的答案是最相關的。沒有備忘錄,他們永遠無法做到。但是如果他們不得不去硬盤尋找答案,他們也永遠無法做到這一點。 (他們也沒有使用SQL ...)

+0

這是一個很好的答案。非常感謝您的批判觀點! – collinjsimpson 2012-04-10 05:35:32