Хотите 40 ГБ памяти сопоставленного файла, но ограничение составляет 4 ГБ?vb.net - PullRequest
0 голосов
/ 07 декабря 2018

Я столкнулся с проблемой в .NET, где мои массивы ограничены объемом ОЗУ, который у меня есть, и мне нужны массивы, которые могут содержать не менее 40 ГБ байтов. Я думал об идее использования жесткого диска в качестве виртуального массива.Мне все равно, если это медленнее.

Я исследовал эту идею и пришел к MemoryMappedFile в VB.net

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

Работает, чтобы создать массив 4 ГБ, но когда я пытаюсь байтабольше 4294967296

Я получаю сообщение об ошибке 'The capacity cannot be greater than the size of the system's logical address space. Parameter name: capacity'

Это 64-битная система, и когда я перешел из режима сборки x86 в режим сборки x64, я могу теперь получить больше места, но при желаемых 40 ГБЯ получаю новую ошибку The paging file is too small for this operation to complete.

Оказалось, что все, что мне нужно было сделать, это изменить файл подкачки, который по умолчанию установлен на 800 МБ на скриншоте, который я разместил в ответе, и теперь он отлично работает!

То есть он ограничен 4 ГБ?Можно ли изменить этот предел где-нибудь в моей системе?У меня есть более 900 ГБ свободного места на жестком диске, почему 4 ГБ - это предел, есть ли что-то, что я могу сделать, или я должен полностью создать файловую систему из примитивов, чтобы иметь возможность читать 40 ГБ порциями.

ЕстьЕсть ли ссылки или компоненты, которые делают большие массивы памяти через виртуальное пространство жесткого диска?

Вот мой код ниже

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

1 Ответ

0 голосов
/ 07 декабря 2018

Решено!

Вам необходимо изменить файл подкачки виртуальной памяти и использовать x64 в режиме сборки

enter image description here

...