64-битное выделение VB.NET> 2 ГБ ОЗУ (ошибка .NET?) - PullRequest
5 голосов
/ 31 июля 2009

У меня есть 64-битное приложение VB.NET, и я хочу выделить буфер размером более 2 ГБ.

В следующем коде «new» и «ReDim» выдают «OverflowException».

Как я могу выделить буферы> 2 ГБ, если эти функции принимают только 32-битные значения со знаком?

(Возможно ли это в C #?)

Редактировать - Я использую WinXP 64 с 4 ГБ ОЗУ.

Dim width As Long = 19005
Dim height As Long = 32768

Dim buffer() As Byte = New Byte((width * height * 4) - 1) {}

Dim size As Long = (width * height * 4) - 1
ReDim buffer(size)

Ответы [ 4 ]

2 голосов
/ 01 августа 2009

Очевидно, что невозможно выделить более 2 ГБ даже под 64-разрядным приложением .net, работающим в 64-разрядной ОС.

Я нахожу это очень разочаровывающим и совершенно не обращающим внимания на то, для чего предназначены 64-битные приложения и ОС. Я имею дело с гигантскими изображениями и хотел бы иметь возможность работать с необработанными байтами в оперативной памяти. Теперь я должен реализовать алгоритмы подкачки, чтобы ограничить порции до 2 ГБ.

Эй, Microsoft, как насчет того, чтобы исправить это в следующем выпуске .NET? Да, я сказал исправить. Это потому что он сломан. Как вы ожидаете взлета 64-битных приложений, когда вы делаете глупых подобных вещей. (Можете ли вы сказать, что я раздражен .) Спасибо за внимание.

Ссылка

http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

2 голосов
/ 01 августа 2009

Я думаю, что UnmanagedMemoryStream делает то, что вам нужно. Документ MSDN для UnmanagedMemoryStream

Я думаю, что это плохая идея - выделять огромный кусок памяти в среде с сборкой мусора, поскольку большинство сборщиков мусора оптимизированы для небольших и недолговечных объектов. Поэтому использование сырой памяти, как правило, является лучшим и более производительным решением для очень больших объектов.

0 голосов
/ 01 августа 2009

Для этого вам, возможно, придется использовать отображенные в память файлы, посмотрите на функцию MapViewOfFile .

0 голосов
/ 01 августа 2009

Следующие работы [в теории] (синтаксис C #):

Array.CreateInstance(typeof(int[]), 0L);

Редактирование: создание типа с выделенным массивом фиксированного размера из 1 ГБ массивов. Вы можете переиндексировать свойство Item с помощью смены.

...