2013-05-27 41 views
2

我有一個C#WCF服務,在Dictionary<File,byte[]>中託管120 GB的內存,可以非常快速地訪問文件內容,這非常適合我。在訪問時,文件內容被包裝在一個MemoryStream中,並且被讀取爲C#中的快速分佈式內存訪問

這項服務需要每天重新啓動以從數據庫加載一些可能每天都會改變的靜態數據。因爲需要重新加載到內存中的大量數據,重新啓動需要很多時間

因此,我決定在同一臺機器上以不同的進程託管此內存,並通過套接字訪問它。數據處理將始終處於運行狀態。的TcpListener /客戶端和的NetworkStream以類似的方式被用於以下

memoryStream.Read(position.PositionData, 0, position.SizeOfData); 

position.NetworkStream.Write(position.PositionData, 0, position.SizeOfData); 

問題是:這比承載在相同的過程中的存儲器慢10倍。預計會出現放緩,但10倍的因素太多了。

我想到了MemoryMappedFiles,但這些對隨機訪問文件的特定視圖更有用。我的文件訪問從頭到尾都是連續的。

有沒有可用於我的案例的不同技術或圖書館?或者這是如此期望?

+0

無法在不重新啓動服務的情況下從數據庫讀取靜態數據嗎? –

+0

在本地機器上使用TCP的決定是錯誤的。在本地執行IPC時應該使用命名管道。 nair的答案是正確的,你不應該做任何重新啓動服務。你應該有一些監控邏輯,只是從數據庫中更新你需要的任何東西。 – anderhil

回答

1

我假設你正在使用SQLServer。如果是這樣,Service Broker & SQLNotificaitonQuery notification可能是你的朋友在這裏。我認爲,您需要更多的推送消息傳遞模型,它會自動將更改傳播回服務(如果在數據庫中發生更改)。因此,避免重新啓動內存/資源密集型進程,因此無需重新映射重量級字典。