【发布时间】:2014-05-22 05:46:56
【问题描述】:
我正在尝试调整供应商的 c# 示例代码以与 PCI-Express 设备连接。该代码基本上将一个大缓冲区分配为一个 int 数组,然后通过 fixed 关键字将其固定,然后将其交给硬件以填充数据。
这很好用,但最终失败了,因为 .Net 被限制在数组中约 20 亿个元素。我可以通过使用 Long 和 gcAllowVeryLargeObjects 关键字的数组将限制推到 16 GB,但最终我仍然遇到 .Net 限制。
在非托管代码中,我可以调用 VirtualAlloc 并直接请求 40 或 50GB,但我不清楚这在 c# 中是否可行,而且我找不到任何好的示例代码。我意识到我可以用不同的语言来做这件事,但至少在 Windows 上我更熟悉.Net,除了程序的这个相对较小的部分之外,几乎没有特定于硬件的代码,所以我想尝试并坚持我所拥有的。
【问题讨论】:
-
“~20 亿”?在 64 位环境中,您可以创建大于 2 GB 的数组,甚至索引也不限于 Int32(请参阅 Array.CreateInstance)。
-
您的具体问题是什么?你也可以在 C# 中使用
VirtualAlloc。 -
即使在 64 位 CLR 应用程序中,每个对象也有 2GB 的硬限制!所以他想要的托管代码是不可能的。
标签: c# memory virtualalloc