【发布时间】:2013-05-22 06:47:39
【问题描述】:
我有一个 C# WCF 服务,它在 Dictionary<File,byte[]> 中托管 120 GB 内存,用于非常快速地访问文件内容,这对我来说真的很有效。访问时,文件内容被封装在 MemoryStream 中并被读取
此服务需要每天重新启动以从数据库中加载一些可能每天都在变化的静态数据。由于需要再次将大量数据加载到内存中,因此重新启动花费了很多时间
所以我决定在同一台机器上的不同进程中托管此内存,并通过套接字访问它。数据进程将始终启动并运行。 TcpListener/Client 和 NetworkStream 的使用方式与以下类似
memoryStream.Read(position.PositionData, 0, position.SizeOfData);
position.NetworkStream.Write(position.PositionData, 0, position.SizeOfData);
问题是:这比在同一进程中托管内存要慢 10 倍。预计会放缓,但 10 倍太多了。
我想到了 MemoryMappedFiles,但它们对于随机访问文件的特定视图更有用。我的文件访问从头到尾都是连续的。
在我的案例中是否可以使用其他技术或库?或者这就是预期的结果?
【问题讨论】:
-
不重启服务就不能从数据库中读取静态数据吗?
-
在本地机器上使用 TCP 的决定是错误的。在本地进行 IPC 时应该使用命名管道。 nair 的答案是正确的,您不应该重新启动服务。您应该有一些监控逻辑,可以从数据库中更新您需要的任何内容。
标签: c# shared-memory tcplistener inter-process-communicat