Re: Ищу грязый хак: byte* -> byte[] -> byte* без копирования
От: vit_as Россия  
Дата: 29.12.13 15:24
Оценка:
Здравствуйте, Albeoris, Вы писали:

A>Доброго времени суток!

A>У меня есть указатель на массив байт. .NET'ие методы умеют работать с управляемым массивом байт. Я не хочу копировать данные из неуправляемой памяти в управляемую, так как unsafe-методы были выбраны специально ввиду того, что я могу в любой момент вручную освободить память (работаю с изображениями) не дожидаясь, пока это сделает сборщик мусора. Выделяя память в упаравляемых массивах я получаю OutOfMemoryException, даже есть насильно запускаю после обработки каждого изображения сборку мусора.

Сам работаю с изображениями на .NET. Но храню весь битмап в управляемом массиве. Для обработки и анализа лучше писать отдельную ассембли на C++/CLI и временные массивы выделять в неуправляемой памяти.
Насчет выделения памяти в управляемых массивов, советую проверить Ваше приложение на предмет утечки памяти с помощью специальных утилит.

A>Как многим, наверное, известно, единственное чем отличается управляемый массив от неуправляемого — 8 байт впереди него, 4 — указатель на тип и ещё 4 — длина массива. Я моуг выделить дополнительно 8 байт, начать запись с 8го, а затем заполнить их (или вначале заполнить — не важно).


A>Но я всё равно не могу из получившейся конструкции получить управляемый массив:

A>byte[] array = (byte[])(object)ptr;
A>byte[] array = (byte[])(dynamic)ptr;
A>Гнусно матерятся.

A>Подскажите — возможно, есть какой-нибудь способ решить эту проблему?

A>Принимаются три варианта решения:
A>1) Превратить byte* в byte[] без копирования.
A>2) Немедленно освободить byte[] размером >150мб
A>3) Скормить методу, который принимает byte[] вместо него byte* (фактически возвращаемся к п.1.)

A>Заранее благодарен за любую помощь.


A>P.S. Ещё раз: никаких new byte[150 * 1024 * 1024]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.