如何使程序集的后续实例共享同一内存?

4
我希望有一个类似于静态类变量的东西,但是当不同的应用程序加载我的程序集时,我希望它们都共享同一个变量。
我知道我可以将数据写入磁盘或数据库中,但这是为了与SQL查询一起使用的进程,这样做可能会减慢速度(实际上我将测试这些选项,但同时我在问这个问题,因为我认为这不是一个可接受的解决方案)。
我更喜欢使用部署开销最小的解决方案,如果解决方案难以创建,只要在完成后易于使用就可以。
我知道有一些持久性内存框架。我还没有检查过任何一个,也许其中一个是完美的,所以请随意推荐一个。我也完全满意自己编写代码,特别是如果它使部署更容易。
提前感谢您所有的建议!
编辑:看起来我忽视了一个非常简单的解决方案。我的问题涉及SQL仅在调用我编写的SQL聚合函数之间序列化数据提供8000字节的空间。我阅读了一篇关于如何压缩数据并充分利用那8000字节的文章,并认为我没有其他选择。事实证明,我可以将MaxBytes设置为-1而不是在0到8000之间的范围内,以获得高达2GB的空间。我相信这是他们在3.5框架中添加的新功能,因为有各种文章谈论这个8000字节的限制。
感谢您所有的答案,因为这是我过去想要解决其他问题的问题,现在我知道如果需要一种真正简单而快速的方法来在应用程序之间通信,该怎么做了。
3个回答

5
你不能将此存储为内存数据并在进程之间共享,因为每个进程都有自己独立的内存地址空间。
然而,一种选择是使用.NET内存映射文件支持来“存储”共享数据。这将允许你编写一个包含信息的文件,在每个进程都可以访问的位置。

哇,这真的很酷。这对于同时运行实例非常有效,但在我的情况下,它们并没有同时运行。听起来内存会在实例之间丢失(或持久化到磁盘上,这样就失去了意义),对吧? - Brandon Moore
1
@BrandonMoore 如果你想在两个不同时运行的实例之间共享数据,你几乎需要持久化它... 你想实现什么目标? - Reed Copsey
一个 SQL 聚合模式函数。例如:“Select description, dbo.mode(price) from products group by style”。抱歉之前没有说清楚,但我想先听听人们提出的替代解决方案,再回答我迄今为止得到的答案类型。问题在于,SQL 为实现聚合函数提供的接口使用了一个只允许 8000 字节的序列化器。 - Brandon Moore

2
每个进程都有自己的地址空间。你不能像你想象的那样简单地共享一个变量。
不过,你可以使用共享内存
如果你正在使用 .NET 4,你可以简单地使用内存映射文件

我猜无论使用哪种选项,都需要一个后台应用程序来保存我正在使用的内存的引用,否则它会在实例之间被释放... - Brandon Moore
如果您确实需要在进程之间缓存大量数据,请查看像memcached(http://en.wikipedia.org/wiki/Memcached)这样设计的产品。 - Alexei Levenkov
您不需要一个后台应用程序。您可以使用 MemoryMappedFile.CreateOrOpen - parapura rajkumar
parapura:Memory Mapped类的文档说明,当您的对象消失时,您的内存也会消失(如果您设置了选项,则它将被持久化到实际文件中,但这违背了其目的)。 - Brandon Moore

1

我的问题之一是大小。我正在使用的接口实际上提供了使用二进制序列化器在实例之间持久化数据的功能,但问题是它允许最大8000字节,这太小了。这会成为一个问题吗? - Brandon Moore
显然你需要其他东西 - 同步对象不能保存超过单个计数的任何内容。 - Alexei Levenkov
我认为那很可能是这样的。不过这确实是一个有趣的想法。 - Brandon Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接