Объявление зубчатого массива успешно, но не хватает памяти при объявлении многомерного массива того же размера - PullRequest
0 голосов
/ 15 мая 2018

Я получаю исключение нехватки памяти при выполнении этой строки кода:

double[,] _DataMatrix = new double[_total_traces, _samples_per_trace];

Но этот код успешно завершается:

double[][] _DataMatrix = new double[_total_traces][];
for (int i = 0; i < _total_traces; i++)
{
    _DataMatrix[i] = new double[_samples_per_trace];
}

Мой первый вопрос: почему это происходит?

В качестве дополнительного вопроса моя конечная цель - провести анализ основных компонентов (PCA) для этих данных.Это довольно большой набор данных.Количество «строк» ​​в матрице может составить пару миллионов.Количество «столбцов» будет около 50. Я нашел библиотеку PCA в структуре Accord.net, которая кажется популярной.Он принимает зазубренный массив в качестве входных данных (который я могу успешно создать и заполнить данными), но у меня заканчивается память, когда я передаю его в PCA - я думаю, потому что он передается по значению и создает копию данных (?),Моей следующей мыслью было написать собственный метод для проведения PCA, чтобы мне не пришлось копировать данные, но я еще не дошел до этого.На самом деле раньше мне не приходилось иметь дело с управлением памятью, так что я открыт для советов.

Редактировать: Это не дубликат темы, указанной ниже, потому что эта ссылка не объясняет, как памятьдва из них хранились по-разному, и почему один из них может вызвать проблемы с памятью, несмотря на то, что оба они имеют одинаковый размер.

1 Ответ

0 голосов
/ 15 мая 2018

В 32 битах сложно иметь непрерывный диапазон адресов, превышающий несколько сотен мегабайт (см., Например, https://stackoverflow.com/a/30035977/613130).). Однако легко иметь разбросанные фрагменты памяти общим объемом около ста мегабайт (или даже 1 Гб)....

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

Обратите внимание, что в 64-битах этогораздо проще создать массив максимального размера, разрешенного .NET (около 2 ГБ или даже больше ... см. https://stackoverflow.com/a/2338797/613130)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...