vb.net - 想要 40 GB 内存映射文件,但限制为 4 GB? VB.net

标签 vb.net memory virtual-memory

我在 .NET 中遇到了一个问题,我的数组受到我拥有的 RAM 数量的限制,并且我需要可以容纳至少 40 GB 字节的数组。我正在考虑使用硬盘驱动器作为虚拟数组的想法不在乎它是否慢。

我正在研究这个想法,并来到了VB.net中的MemoryMappedFile

    Dim mmF As MemoryMappedFile
    mmF = MemoryMappedFile.CreateOrOpen("MemArray", 4294967295) 

可以创建一个 4 GB 数组,但当我尝试多一个字节时,结果是 4294967296

我收到错误 '容量不能大于系统逻辑地址空间的大小。 参数名称:容量'

这是 64 位系统,当我从 x86 构建模式切换到 x64 构建模式时,我现在可以获得更大的空间,但在我想要的 40 GB 时,我收到一个新错误 分页文件太小,无法执行此操作完成。

结果我所要做的就是更改分页文件,该文件在我在答案中发布的屏幕截图中默认为 800 MB,现在可以完美运行!

所以它的上限是 4 GB 吗?这个限制可以在我的系统中的某个地方改变吗?我有超过 900 GB 的可用硬盘空间,为什么 4 GB 是限制,我能做什么,或者我必须完全从基元构建一个文件系统,以便能够按 block 读取 40 GB。

是否有任何引用或组件可以通过虚拟硬盘空间进行大内存阵列?

下面是我的代码

Public Function GetRotation(Data As Byte(), rotation As UInteger) As Byte()
    'This works for very big numbers at very fast speeds.
    'This cycle rotates the values without looping array.
    Dim rotationData As New List(Of Byte)

    Dim start As UInteger = Data.Length - rotation Mod Data.Length

    For i = 0 To Data.Length - 1
        rotationData.Add(Data((start + i) Mod (Data.Length)))
    Next

    Return rotationData.ToArray()
End Function

Public Function SortLexicoGraphicallyArrayMappedFile(ByRef data As Byte()) As UInteger()
    Dim OrderedRotations As New List(Of UInteger)
    Dim rotatedData As Byte()
    Dim rotation As UInteger = 0


    Dim mmF As MemoryMappedFile
    'mmF.
    mmF = MemoryMappedFile.CreateOrOpen("MemArray", 4294967295) 'CLng(data.LongLength * data.LongLength))
    Dim mmVA As MemoryMappedViewAccessor
    mmVA = mmF.CreateViewAccessor(0, data.LongLength * data.LongLength)

    Dim pos As Long = 0

    For rotation = 0 To data.Length - 1
        rotatedData = GetRotation(data, rotation)
        mmVA.WriteArray(Of Byte)(pos, rotatedData, 0, rotatedData.Length)
        pos += rotatedData.LongLength
    Next

    'TODO later sorting them

    Return OrderedRotations.ToArray()
End Function

最佳答案

解决了!

您需要修改虚拟内存分页文件并在构建模式下使用 x64

enter image description here

关于vb.net - 想要 40 GB 内存映射文件,但限制为 4 GB? VB.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53664802/

相关文章:

jquery - 如何给滚动条,高度自动完成显示列表?

vb.net - Imgur API和VB.NET帮助-图片发布

vb.net - 如何在 vb.net 中处理表单关闭事件

c++ - 从闭源库中检索静态指针,不由公共(public)接口(interface)公开

PHP - 读取目录与从数据库中获取

c - 从内核空间访问数据段

vb.net - 转发器控制导致无效的回发或回调参数

java - 更改第 3 方进程的已知内存地址中的值,Java

operating-system - 虚拟内存真的一直有用吗?

连接两个十六进制地址(PPN 和 VPO),形成一个物理地址