Я разрабатываю приложение, которое состоит из двух частей:Передача больших структур данных в неуправляемый код, используя фиксированный указатель
- C# фронтальных
- C++ номер CruNcher
В некоторых случаях количество данных, переданных с C# на C++, может быть действительно большим. Я говорю о Gb и, может быть, больше. В частности, есть большой массив двойников, и я хотел передать привязку/фиксированный указатель на этот массив на код C++. Количество хрустов может занять до нескольких часов. Я беспокоюсь о любых проблемах, которые могут быть вызваны этим использованием указателей пиннинга. Как я вижу, сборщик мусора не сможет долго коснуться этой большой области памяти. Это может вызвать проблемы? Должен ли я рассматривать другую стратегию?
Я думал, что вместо передачи всего массива я мог бы предоставить интерфейс для построения этого массива из кода C++, так что память принадлежит неуправляемой части приложения. Но в итоге обе стратегии создадут большой кусок памяти, который долгое время не перемещается для сборщика мусора C#. Я что-то упускаю?
Наличие нескольких распределений в LOH до GB или более не оказывает отрицательного воздействия? – Alex
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) –
@ Christian.K Так что это не автоматическое, скорее, это вызов метода. Кажется, я в порядке? – Max