2012-10-10 139 views
0

我有一些經常被我的網站使用的表格。例如,最大的一個是一個位置表,它持有大量的靜態數據。所以,當用戶通過我的網站時,他們會在這些位置搜索。它擁有大約150萬行。我已經使用內存分析器調整了這張表的大小,並且它在內存中將近500mb。最終我有更多的靜態表,我需要非常快速地訪問它們,它們是靜態的。最後我的內存轉儲可以達到1,5 GB的內存使用量。這對我來說不是一個問題,而我有一個功能強大的服務器,有很多可用的內存。但是當我提出這個問題時,高級開發人員和架構告訴我應該檢查我的項目,因爲一個進程不應該佔用那麼多的內存。但我需要快速訪問,我不想每次都查詢我的數據庫。我需要在1秒以內回覆。這就是爲什麼記憶看起來像我的方式。有沒有更好的建議?在內存中共享大數據表?

我正在使用asp.net和ms SQL 2008.目前Framework 4.0,但很快會4.5。我的網絡服務器上的IIS 7.5。

我很感謝您的幫助。 謝謝。

+1

最具擴展性的方法是使用數據庫,1.5M行是什麼。它永遠不會超過一秒鐘。 –

+0

如果你有機會接觸到一個體面的DBA,就把你的腦袋放在一起,看看你是否無法拿出一套合理的索引 - 在適當的數據庫調整下,你應該很容易地達到1-2秒的期望性能閾值。我同意Tim Schmelter。 – bUKaneer

+0

對不起。我犯了一個嚴重的錯誤。我需要在1秒以內。 0,1,0,2秒等這就是我能夠使用內存,但不是數據庫。 – batmaci

回答

1

該過程絕對不應該持有這個記憶本身。 http服務器可能希望讓進程並行運行幾(千)次,而不會遇到麻煩。現在這是而不是來說數據不應該在內存中。大部分時間內,所有的Google數據都在內存中。你只需要小心你如何加載它們。

  1. 如果數據庫服務器是什麼好(應該是),它實際上將保存在內存中的數據,如果他們被頻繁訪問,或者如果您設置適當的緩存策略。這應該給你體面的表現,而不必做太多的工作或任何奇怪的技巧。
  2. 您可以使用memcached(即Google的方式)。
  3. 您可以使用自定義格式的文件中的數據,以便在您的特定用例中快速訪問並通過內存映射進行訪問。
0

在生產環境中不建議保留大量的靜態數據。正如我在您的場景中看到的那樣,您的數據集可以進行標準化並管理最小數量的初始數據集。

其他方式是使用像構建器這樣的設計模式來構建數據集,只需要根據需要構建數據集。

通過採用這種方法,您可以避免將不必要的數據集保留在您的記憶中。並在你想要的時候加載你想要的東西。 [1]上提供了構建器的基本思想。

[1] .http://www.oodesign.com/builder-pattern.html