【问题标题】:Does a System Wide Global List variable exist系统范围的全局列表变量是否存在
【发布时间】:2020-11-25 00:52:30
【问题描述】:

我有一个这样的 3 维列表:
List<List<List<Vector128<byte>>>> dimensionLIST = new List<List<List<Vector128<byte>>>>();

现在,当我用用于计算的数据填充此列表时,它将占用 20 GB 的 RAM 内存。

我所做的计算需要 10 个小时。所以我创建了一个解决方案,我打开了 10 个应用程序实例,我将工作分成 10 个部分,这将使计算只需 1 小时(我的计算机中有 24 个内核)

现在的问题是,表单应用程序的每个实例都需要读取此 dimensionLIST,这意味着这将占用 20 GB * 10 = 200 GB RAM,这不是一个解决方案。

我的问题是,是否有可能将此 dimensionLIST 放入某种系统范围的全局列表变量中 - 所有 10 个实例都可以访问该变量?

(要说的是我不能把这个dimensionLIST 分成10 块,因为每个实例实际上都需要整个列表)

谢谢!

【问题讨论】:

  • 内存映射文件,也许吧?还是其他共享内存、文件映射语义?这里有一些东西可以帮助你:docs.microsoft.com/en-us/windows/win32/memory/…
  • 是的,也许。我听说过内存映射文件,但这对我来说真的很新鲜。我不确定它是如何工作的,是否可以在这样的记忆中添加List<List<List<Vector128<byte>>>>
  • 你必须重新设计你做事的方式,当然......但你将从 200GB 内存减少到 20GB 内存......这种魔法永远不会免费。
  • 你不能让你的应用程序多线程吗?因此 10 个工作和平可以由一个应用程序完成,但由不同的内核同时完成。
  • @RomCoo -- 这是个好主意。更多信息在这里:stackoverflow.com/questions/2510593/…

标签: c# list global-variables system-variable


【解决方案1】:

您可以使用Named Pipes

命名管道是用于通信的命名单向或双工管道 在管道服务器和一个或多个管道客户端之间。所有实例 命名管道共享相同的管道名称,但每个实例都有自己的 缓冲区和句柄,并为客户端/服务器提供单独的管道 沟通。实例的使用使多个管道客户端能够 同时使用相同的命名管道。任何进程都可以访问命名管道,但需要经过安全检查,这使得命名管道成为相关或不相关进程之间的一种简单通信形式。

交替

使用 Windows File Mapping Object,它允许您在进程之间共享内存。

正如评论中提到的 Memory Mapped Files 可能是一个可行的选择

【讨论】:

  • 谢谢,我也会查一下Named Pipes。这似乎是一个有趣的选择。
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2017-12-06
  • 2015-11-27
  • 2016-08-13
  • 2012-04-29
  • 2021-09-26
  • 2017-02-17
相关资源
最近更新 更多