2013-11-22 2 views
1

Я разрабатываю приложение, которое состоит из двух частей:Передача больших структур данных в неуправляемый код, используя фиксированный указатель

  1. C# фронтальных
  2. C++ номер CruNcher

В некоторых случаях количество данных, переданных с C# на C++, может быть действительно большим. Я говорю о Gb и, может быть, больше. В частности, есть большой массив двойников, и я хотел передать привязку/фиксированный указатель на этот массив на код C++. Количество хрустов может занять до нескольких часов. Я беспокоюсь о любых проблемах, которые могут быть вызваны этим использованием указателей пиннинга. Как я вижу, сборщик мусора не сможет долго коснуться этой большой области памяти. Это может вызвать проблемы? Должен ли я рассматривать другую стратегию?

Я думал, что вместо передачи всего массива я мог бы предоставить интерфейс для построения этого массива из кода C++, так что память принадлежит неуправляемой части приложения. Но в итоге обе стратегии создадут большой кусок памяти, который долгое время не перемещается для сборщика мусора C#. Я что-то упускаю?

ответ

1

У вас нет проблем. Большие массивы выделяются в кучу больших объектов. Прикрепление их не может иметь никакого отрицательного эффекта, LOH не уплотняется. «Large» здесь означает массив удвоений с 1000 или более элементами для 32-битного кода или любого массива, равного или превышающего 85 000 байт.

+1

Наличие нескольких распределений в LOH до GB или более не оказывает отрицательного воздействия? – Alex

+0

LOH можно уплотнять «по требованию», начиная с .net 4.5.1 (http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on- the-large-object-heap.aspx) –

+0

@ Christian.K Так что это не автоматическое, скорее, это вызов метода. Кажется, я в порядке? – Max

0

Для вашего конкретного случая использования может оказаться целесообразным использовать файл с отображением памяти в качестве буфера разделяемой памяти между вашим кодом C# и C++. Это вообще обходит сборщик мусора. А также позволяет пейджеру кэш-памяти OS справляться с проблемами с памятью, а не с управляемой памятью GC.

Смежные вопросы