Перераспределение матрицы из неуправляемой в управляемую

Я пытался заставить кусок кода перераспределить огромную неуправляемую матричную структуру (а именно std::vector<std::vector<T> >) в эквивалентную управляемую структуру (cli::array<T,2>). Поскольку я не могу удерживать обе структуры в памяти одновременно, я решил записать в файл и прочитать структуру обратно. Проблема в том, что как только я удаляю исходную матрицу, и, следовательно, память, пытающаяся выделить управляемую память для матрицы, терпит неудачу.

Я полагаю, что это может иметь какое-то отношение к куче разных сред выполнения cpp vs clr. Но не могу найти конкретных деталей. Возможно ли, что среда выполнения cpp сохраняет пространство кучи, что мешает куче clr выделить матрицу обратно? Если да, то можно ли заставить среду выполнения cpp очистить пространство кучи, чтобы освободить место для кучи clr.

Теперь, чтобы уточнить, матрица назначения должна быть двумерным массивом, а не зубчатым массивом. Я знаю, что это проблема, которую нельзя изменить. В противном случае я мог бы перемещать матрицу меньшими кусками.

Заранее спасибо.


person fprades    schedule 09.03.2012    source источник
comment
Невозможность использовать зубчатый массив - довольно искусственное ограничение. Это, безусловно, решает вашу проблему фрагментации адресного пространства. 64-разрядная операционная система - это простой способ решения проблемы.   -  person Hans Passant    schedule 09.03.2012


Ответы (1)


Если у вас не может быть и того, и другого в памяти одновременно, думаю, размер массива больше гигабайта. Если вы хотите поместить это в управляемый прямоугольный (без зубчатых) массив, CLR должна будет найти гигабайт непрерывной памяти ... Это может легко потерпеть неудачу.

Вы пытались запустить 64-разрядную версию или 32-разрядную версию, объявленную как «с большим адресом»? Последний даст вам 4 гигабайта адресного пространства, если он работает на 64-битной машине с Windows, он может подойти.

person Community    schedule 09.03.2012
comment
Я на самом деле связываюсь с flag / largespaceaware. И в настоящее время рассматривает возможность перехода на 64-битную версию, однако не все работающие машины являются 64-битными. Нужна ли CLR постоянная память? Я думал, что виртуальная адресная система позаботится об этом, как это было с только что освобожденным вектором ‹vector›. - person fprades; 09.03.2012
comment
Двумерный массив непрерывен в памяти (в адресном пространстве ваших приложений). Ваше адресное пространство может быть фрагментировано выделениями в вашем коде C ++. Рассмотрите возможность запуска кода C ++ в отдельном процессе. Вы все равно создаете файл для передачи данных. - person ; 09.03.2012