c# - 如何在 C# 中分配超过 MaxInteger 字节的内存

标签 c# memory-management

我希望分配超过 MaxInteger 字节的内存。

Marshall.AllocHGlobal() 需要一个整数 - 所以我不能使用它。还有别的办法吗?

更新

我将平台更改为 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);

最佳答案

这在目前的主流硬件上是不可能的。内存缓冲区限制为 2 GB,即使在 64 位机器上也是如此。缓冲区的索引寻址仍然使用 32 位有符号偏移量完成。技术上可以生成可以索引更多的机器代码,使用寄存器来存储偏移量,但这很昂贵并且会减慢所有数组索引,即使对于不大于 2 GB 的数组也是如此.

此外,您无法从 32 位进程可用的地址空间中获得大于 650MB 的缓冲区。没有足够的连续内存页可用,因为虚拟内存在不同地址包含代码和数据。

IBM 和 Sun 等公司销售的硬件可以做到这一点。

关于c# - 如何在 C# 中分配超过 MaxInteger 字节的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652911/

相关文章:

c - 我的 C 程序有一个 char,我希望它能容纳更多数据,我应该用什么数据类型替换它?

c++ - 释放从 placement new 分配的内存

c - 获取 void* 的大小以创建一个简单的通用动态分配数组 - C

c# - 通过 SSL 连接到 IRC

c# - 当一个程序被称为依赖于机器时——这是什么意思?

c# - 如何以编程方式获取 .Net WinForms 控件的屏幕截图?

C++ 使用运算符重载构建双面树 - 什么是好的内存解决方案?

iphone - 对于复制 NSString,我是否需要显式保留副本

c# - XSD.exe - 如何初始化从 xs :choice 创建的类型

c# - 如何使用 Microsoft Graph api 从 azure Active Directory 获取所有用户属性