Я столкнулся с проблемой в .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