【问题标题】:Fast Distributed Memory Access in C#C# 中的快速分布式内存访问
【发布时间】: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


【解决方案1】:

我假设您使用的是 SQLServer。如果是这样,Service Broker & SQLNotificaitonQuery notification 可能是您的朋友。我想,您需要更多的推送消息模型,它会自动将更改传播回服务(如果数据库发生变化)。因此,避免重新启动内存/资源密集型进程,因此无需重新映射您的重量级字典。

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2017-09-07
    • 2011-06-28
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多