Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用可由不同进程直接读取且无复制开销的共享内存的最佳方法_C#_.net_Shared Memory_Inter Process Communicat - Fatal编程技术网

C# 使用可由不同进程直接读取且无复制开销的共享内存的最佳方法

C# 使用可由不同进程直接读取且无复制开销的共享内存的最佳方法,c#,.net,shared-memory,inter-process-communicat,C#,.net,Shared Memory,Inter Process Communicat,我有一个应用程序,其中初始化涉及从文件中读取非常大的数据(~>10GB),然后对这些数据执行一些计算(类型为Dictionary)。尽管我的数据已修复/从未更改,但每次初始化步骤都需要几个小时。我想做的是以某种方式使用一个进程将这些数据预加载到内存中,并在同一台机器上使用另一个进程将所有数据直接读取一次,而不复制。到目前为止,我找到了两种方法: 使用远程对象进行.Net远程处理。然而,这种方法承担了封送成本,因此不适用于我的案例,因为数据传输会在一个点上产生两倍的内存 内存映射文件。这个选项似

我有一个应用程序,其中初始化涉及从文件中读取非常大的数据(~>10GB),然后对这些数据执行一些计算(类型为Dictionary)。尽管我的数据已修复/从未更改,但每次初始化步骤都需要几个小时。我想做的是以某种方式使用一个进程将这些数据预加载到内存中,并在同一台机器上使用另一个进程将所有数据直接读取一次,而不复制。到目前为止,我找到了两种方法:

  • 使用远程对象进行.Net远程处理。然而,这种方法承担了封送成本,因此不适用于我的案例,因为数据传输会在一个点上产生两倍的内存

  • 内存映射文件。这个选项似乎仍然需要数据拷贝,对于我来说,它并不理想,因为我需要拷贝所有>10GB的数据。我发现了一些关于使用不安全的内存地址访问的文章,但我不知道这是如何工作的

  • WCF命名管道。这种方法似乎类似于远程处理,仍然需要数据传输


对于我的场景,最有效的方法是什么?

我不知道如何在内存中高效地保存10GB的数据。无论您采用何种方法在内存中存储10GB的数据,都会过多地使用系统缓存,并会降低整个系统的速度


如果可以的话,我建议使用数据库。如果您不能使用数据库,请尝试存储初始化的数据,并在需要时使用缓存读取部分。

我不知道如何在内存中有效地保留10GB的数据。无论您采用何种方法在内存中存储10GB的数据,都会过多地使用系统缓存,并会降低整个系统的速度


如果可以的话,我建议使用数据库。如果无法使用数据库,请尝试存储初始化的数据,并在需要时通过缓存读取部分。

如果要将数据放入字典,为什么不使用任何流行的nosql键值存储(couchbase、riak、redis),则任何进程都可以处理数据。如果您完全反对这种想法,您可以始终使用NancyFx框架在“主机”应用程序中托管本地rest服务端点,那么需要使用预加载数据的任何其他应用程序都可以与主机提供的服务交互

如果要将数据放入字典,为什么不使用任何流行的nosql键值存储(couchbase、riak、redis),那么任何进程都可以处理数据。如果您完全反对这种想法,您可以始终使用NancyFx框架在“主机”应用程序中托管本地rest服务端点,那么需要使用预加载数据的任何其他应用程序都可以与主机提供的服务交互

在具有服务器级RAM(32Gb或更高)的windows server 64位操作系统上,这不应该是一个问题,对吗?我的印象是,一台健壮的机器不应该在有空闲内存的情况下将内存复制到磁盘上,而且只有在内存用完时才会使用系统缓存。我不认为存在缓存问题。如果你不同意,你能详细说明这个问题吗?我不是Windows内存管理方面的专家,但总是看到过太多使用Windows的磁盘交换,即使还有很多可用ram。但是,如果您确实需要在内存中存储那么多数据,那么最好像现在这样将其保存在应用程序空间中。您可以做的一件事就是永远不要关闭应用程序。只要在用户关闭应用程序时将其隐藏即可。因此,任何解决方案都只需加载一次即可。在具有服务器级RAM(32Gb或更高)的windows server 64位操作系统上,这不应该是一个问题,对吗?我的印象是,一台健壮的机器不应该在有空闲内存的情况下将内存复制到磁盘上,而且只有在内存用完时才会使用系统缓存。我不认为存在缓存问题。如果你不同意,你能详细说明这个问题吗?我不是Windows内存管理方面的专家,但总是看到过太多使用Windows的磁盘交换,即使还有很多可用ram。但是,如果您确实需要在内存中存储那么多数据,那么最好像现在这样将其保存在应用程序空间中。您可以做的一件事就是永远不要关闭应用程序。只要在用户关闭应用程序时将其隐藏即可。因此,无论你需要什么解决方案,只需加载一次。我不确定这是否是我需要的。任何数据库服务都需要查询和数据传输,这不是我想要的。我的应用程序是数据密集型和计算密集型的,因此我需要内存中的所有内容,而不是使用临时查询,这肯定会大大降低性能。如果您完全反对使用任何类型的数据库,那么我认为使用自托管服务是您的最佳选择,我建议使用NancyFx,因为它易于设置和自托管,您也可以使用TcpListener/TcpClient创建客户机-服务器功能。我不熟悉自托管服务,请耐心等待。它是否仍然遵循客户机/服务器模式,并在客户机请求时执行数据复制?我一直在寻找直接访问内存中数据的方法,就像它是在同一个进程中创建的一样。可能吗?从我的研究来看,内存映射文件似乎是最接近的路径。即使使用内存映射文件,您仍将创建一个.net对象以使用内存,web服务将发送数据的副本,但您仍然需要它,这有什么关系?我不确定这是否是我需要的。任何数据库服务都需要查询和数据传输,这不是我想要的。我的应用程序是数据密集型和计算密集型的,所以我需要一切