2011-06-10 82 views
6

我正在開發一個客戶端/服務器應用程序,其中服務器端保存大量數據,例如客戶端請求的大圖片或視頻文件,我需要創建一個內存中客戶端緩存系統來保存這些數據大數據來加速這個過程。要清楚的是,每個單獨的圖像或視頻都不是那麼大,但它們的整體尺寸可能非常大。緩存系統應該在Windows上使用多少內存?

但是我面臨着「我應該緩存多少數據」的問題,並且想知道在Windows上有什麼黃金規則應該採用什麼策略。緩存是在客戶端完成的,我不需要在服務器上緩存。

  1. 我應該一直呆在全局內存使用量的x%以下嗎?那會是多少?如果另一個程序啓動並佔用大量內存,應該如何清空緩存?
  2. 我應該在緩存之前請求多少可用內存,並根據需要使用該內存的固定百分比?
  3. 我希望我不必去那裏,但我應該問用戶他願意分配給我的應用程序多少內存?如果是這樣,我如何計算該屬性的默認值以及那些永遠不會使用該設置的人?
+0

那麼,一個圖像可以由多個客戶端請求?或者,可以在10分鐘內多次請求一張圖像? – Ampere 2011-06-10 11:32:19

+0

圖像可以由多個客戶端請求,並在10分鐘內多次請求,但我認爲這是無關緊要的,因爲我需要客戶端而不是服務器的緩存策略。 – jonjbar 2011-06-10 11:42:33

+0

我不明白。在服務器端,你想爲每個客戶端創建一個單獨的緩存? – Ampere 2011-06-10 11:44:46

回答

8

與其創建自己的緩存算法,不如將數據寫入具有FILE_ATTRIBUTE_TEMPORARY屬性的文件,並利用客戶端計算機自己的緩存。

儘管這種方法似乎意味着您使用了一個文件,但如果系統中有可用內存,那麼該文件將永遠不會離開緩存並且一直保留在內存中。

一些優點:

  • 你不需要編寫任何代碼。
  • 系統緩存考慮到所有其他正在運行的進程。你自己採取這種做法是不切實際的。
  • 在64位Windows上,系統可以將所有可用的內存用於緩存。在32位德爾福進程中,你被限制在32位地址空間。
  • 即使緩存已滿並且文件被刷新到磁盤,本地磁盤訪問也比查詢數據庫然後通過網絡傳輸文件快得多。
+1

這是非常有趣的,但我有點擔心防病毒掃描儀,正如在下面的文章中提到的,它減緩了這個過程:http://stackoverflow.com/questions/5242676/using-file-attribute-temporary -and-file-flag-delete-on-close – jonjbar 2011-06-10 09:22:24

+3

你只寫了一次,大概讀過很多次。病毒掃描程序,如果它掃描文件,將佔用時間的一小部分。如果您在代碼中的熱循環中一遍又一遍地寫入文件,那麼您可能會遇到問題。緩存的重點在於你不經常寫入,但更頻繁地讀取它。 – 2011-06-10 09:43:35

+0

@John - 您可以放置​​一個異常,以防antivir不會掃描您的共享/緩存文件。 – Ampere 2011-06-10 11:47:16

1

這取決於服務器上運行的其他軟件。我可以首先手動配置它。開發一個可以使用特定數量內存的系統。如果可以,請構建它,以便在運行時更改該值。

如果你有這些可能性,你可以嘗試一些調整,看看什麼效果最好。我不知道任何黃金法則,但我想你應該能夠設置總內存或總可用內存的百分比,並且具有特定的最小內存量,以便系統始終可以免費使用。如果您爲服務器操作系統保存了500 MB的最小值,則可以使用其餘部分,或其餘90%用於緩存。但是這些數字取決於操作系統的版本和服務器上運行的其他應用程序。

我認爲最好從外部對數字進行配置,並創建一個管理工具,讓您可以先手動設置數值。然後,如果你發現什麼效果最好,你可以推導公式來計算這些值,並將它們集成到管理工具中。這個工具不應該是緩存程序本身的一個組成部分(這可能是一個沒有GUI的服務)。

+1

這個策略是將一小部分留給系統並使用剩餘部分(在這裏你說的是90%)並不是重新確定的。內存碎片可能會減少緩存的可用空間。 – az01 2011-06-10 08:48:13

+0

感謝你們雙方的意見。 – jonjbar 2011-06-10 12:10:49

0

說實話,你問的問題不是我最關心的問題。我會更關心緩存的有效性。如果你的文件真的很大,你可以保存多少個緩存?如果您的客戶端服務器應用程序擁有多個用戶,那麼您的緩存實際上會緩存其他人將使用的內容的可能性有多大?

在你花費太多精力細節之前,先做一個分析可能是值得的。

+0

緩存由客戶端完成,因此每個客戶端都擁有自己的緩存。關於文件大小,每一個都不是那麼大,但是把它們全部放在客戶端緩存中的附加內存是問題,因此我的問題是我應該在客戶端分配多少緩存。 – jonjbar 2011-06-10 08:48:32

1

服務器應用程序通常需要爲管理員自己使用而預留的資源。我不關心其他應用程序的行爲,我會關心做一個「禮貌」的應用程序,因此它應該允許內存緩存大小等由管理員配置,這是唯一知道如何正確配置他的系統的人(通常是......)

默認值應該考慮整體上有多少內存可用,尤其是對於內存少於4GB的32位系統(只要Delphi只提供32位應用程序),要留下一些東西免費使用操作系統,避免太頻繁的交換。要求用戶在安裝時選擇它也是可取的。

如果應用程序是服務器上唯一運行的應用程序,則可用內存的40%到75%之間的值可能是正確的(取決於超出緩存需要多少內存),但再次詢問用戶是因爲它幾乎不可能知道運行其他應用程序可能需要什麼。您還可以擁有最小緩存大小和最大緩存大小,首先分配較低的值,然後在需要時增大容量,並在必要時縮小容量。

在32位系統上,這是一種內存使用情況,可以從使用PAE/AWE訪問超過3GB的內存中受益。

更新:您還可以執行緩存命中/未命中監視並計算哪個緩存大小最適合用戶需要(它可能太小但太大),並提醒用戶注意。

+0

謝謝您的輸入。 – jonjbar 2011-06-10 12:12:03

+0

如果緩存在客戶端同樣的考慮appy,讓用戶選擇最適合他的設置(像Photoshop這樣的應用程序有像這樣的配置選項)。如果應用程序是用戶在特定時間使用的主應用程序,它將樂意儘可能多地允許內存儘可能高效地工作,但是隻有用戶可以知道多少是可以的。此外,這個應用程序是針對「專業」用戶還是「休閒」用戶?前者通常需要控制,後者可能需要更多指導和自動計算的值。 – 2011-06-10 12:32:57

1

問題:

  1. 一個圖像可以被多個客戶端請求?或者,可以在短時間內多次請求一張圖像?

  2. 間隔有多短?

  3. 網絡的速度真的很高?高於硬盤的速度?如果你有一個正常的網絡,那麼硬盤將能夠從磁盤讀取文件並實時通過網絡傳送它們。特別是Windows已經在做一些很好的緩存,所以最新的文件已經在緩存中。

  4. 運行服務器應用程序的計算機的主要目的是運行服務器?或者只是一臺普通的電腦也用於其他任務?換句話說,它是一個專用的服務器還是一個普通的工作站/桌面?

,但我要問他是多少 內存願意分配給我的 應用程序的用戶?

我肯定會去那裏! 如果用戶認爲服務器應用程序不是一個重要的應用程序,它可能會給它低優先級(低緩存)。否則,它認爲它是最重要的運行應用程序,它將允許應用程序分配它所需的所有RAM,而不利於其他不太重要的應用程序。

只需將該設置默認設置爲可接受的值(這將是RAM總量的x%)即可。如果計算機的主要目的是保存這個服務器應用程序,我將使用像總內存的70%,如果其目的是「一般使用」的計算機,則使用約40-50%。

+0

如上所述,我需要一個客戶端緩存系統,其中從服務器「下載」的數據被緩存以便快速訪問。感謝您的輸入。 – jonjbar 2011-06-10 12:10:09

相關問題