我希望分配超过 MaxInteger 字节的内存。
Marshall.AllocHGlobal() 需要一个整数 - 所以我不能使用它。还有别的办法吗?
Update
我将平台更改为 x64,然后运行下面的代码。
myp 似乎有正确的长度:大约 3.0G。但顽固地“缓冲”最大为 2.1G。
知道为什么吗?
var fileStream = new FileStream(
"C:\\big.BC2",
FileMode.Open,
FileAccess.Read,
FileShare.Read,
16 * 1024,
FileOptions.SequentialScan);
Int64 length = fileStream.Length;
Console.WriteLine(length);
Console.WriteLine(Int64.MaxValue);
IntPtr myp = new IntPtr(length);
//IntPtr buffer = Marshal.AllocHGlobal(myp);
IntPtr buffer = VirtualAllocEx(
Process.GetCurrentProcess().Handle,
IntPtr.Zero,
new IntPtr(length),
AllocationType.Commit | AllocationType.Reserve,
MemoryProtection.ReadWrite);
unsafe
{
byte* pBytes = (byte*)myp.ToPointer();
var memoryStream = new UnmanagedMemoryStream(pBytes, (long)length, (long)length, FileAccess.ReadWrite);
fileStream.CopyTo(memoryStream);
这在当前的主流硬件上是不可能的。即使在 64 位机器上,内存缓冲区也限制为 2 GB。缓冲区的索引寻址仍然使用 32 位有符号偏移量完成。从技术上讲,可以生成可以索引更多的机器代码,使用寄存器来存储偏移量,但这很昂贵并且速度变慢all数组索引,即使对于不大于 2 GB 的数组也是如此。
此外,您无法从 32 位进程可用的地址空间中获得大于约 650MB 的缓冲区。没有足够的连续内存页可用,因为虚拟内存在不同地址包含代码和数据。
IBM 和 Sun 等公司销售的硬件可以做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)