intArray для doubleArray, исключение нехватки памяти C # - PullRequest
5 голосов
/ 23 января 2012

Я пытаюсь преобразовать массив 10 000 x 10000 int в двойной массив следующим методом (я нашел на этом сайте)

public double[,] intarraytodoublearray( int[,] val){ 

        int rows= val.GetLength(0);
        int cols = val.GetLength(1);
        var ret = new double[rows,cols];
        for (int i = 0; i < rows; i++ )
        {

            for (int j = 0; j < cols; j++) 
            {
                ret[i,j] = (double)val[i,j];
            }
        }
        return ret;
}

, и способ, которым я вызываю, -

 int bound0 = myIntArray.GetUpperBound(0);
 int bound1 = myIntArray.GetUpperBound(1);
 double[,] myDoubleArray = new double[bound0,bound1];  
 myDoubleArray = intarraytodoublearray(myIntArray)  ;

это дает мне эту ошибку,

Unhandled Exception: OutOfMemoryException
[ERROR] FATAL UNHANDLED EXCEPTION: System.OutOfMemoryException: Out of memory
at (wrapper managed-to-native) object:__icall_wrapper_mono_array_new_2 (intptr,intptr,intptr)

Машина имеет 32 ГБ ОЗУ, ОС MAC OS 10.6.8

1 Ответ

5 голосов
/ 23 января 2012

Итак, вы пытаетесь создать массив из 100 миллионов дублей (каждый из которых занимает 800 МБ) - дважды :

// This line will allocate an array...
double[,] myDoubleArray = new double[bound0,bound1];  
// The method allocates *another* array...
myDoubleArray = intarraytodoublearray(myIntArray);

Зачем беспокоиться об инициализации myDoubleArray дляпустой массив, а затем переназначение значения?Просто используйте:

double[,] myDoubleArray = intarraytodoublearray(myIntArray);

Это уменьшит вдвое объем памяти, используемой для одной вещи.Теперь, будет ли это работать в этот момент, я не уверен ... это зависит от того, как Mono работает с большими объектами и памятью.Если вы используете много памяти, вы определенно хотите убедиться, что вы используете 64-битную виртуальную машину.Например:

gmcs -platform:x64 ...

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

Кроме того, intarraytodoublearray - ужасное имя - он использует псевдоним int вместо имени Int32 фреймворка и игнорирует соглашения о капитализации.Int32ArrayToDoubleArray будет лучше.

...