Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129

Ошибка OutOfMemoryException при создании матрицы

12.12.2016, 22:38. Показов 1872. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь создать матрицу

C#
1
2
3
4
maxi    = 14357
maxj    = 2515
 
double[,] res = new double[maxi, maxj];
Выдает ошибку "Выдано исключение типа "System.OutOfMemoryException"."
что это и как с этим можно боротся?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2016, 22:38
Ответы с готовыми решениями:

Ошибка при создании матрицы
Здравствуйте, дорогие форумчане-специалисты. Сразу говорю, недавно начал изучать С#, поэтому вопрос будет носить нубический характер, но...

Ошибка OutOfMemoryException при работе с большими файлами
ни как не могу победить ошибку, выручайте форумчане! Суть такова закидываю 5 больших файлы в stream(400 -600 мб) и получаю асинхронно...

Ошибка OutOfMemoryException при передаче больших файлов
Приветствую! Используя приложение (клиент сервер), при передаче больших файлов выходит ошибка: Выдано исключение типа...

9
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
12.12.2016, 23:39
EgorDybovik, в этой теме OwenGlendower всё более чем подробно объяснил.

Единственный выход - уменьшить размерности массива и обрабатывать данные "по кусочкам".
Меня даже берёт любопытство, для чего мог понадобиться массив double-ов ТАКИХ размеров...
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
12.12.2016, 23:42  [ТС]
инпеданстная томография, решение прямой задачи методов конечных елементов дальше будет еще хуже, матрица размером 9514*4757 )спасибо за ответ
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
12.12.2016, 23:49
EgorDybovik, а обязательно прям ВЕСЬ этот массив в памяти держать? предполагаю, что даже в таких задачах последовательная - "покусочная" обработка данных вполне допустима.
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
12.12.2016, 23:53  [ТС]
к сожалению нет.. там потом считается обратная матрица от этой .. а при расчетах используется сразу целиком матрица .. скажите какие граничные размеры матрицы double можно создать ? и разве действительно нет никаких вариантов созжавать такие матрицы ? .. как то же обрабатывают матрицы и побольше
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
13.12.2016, 02:01
У меня свободно создается массив double 16383х16383 (это примерно 2 GB памяти). Вы что- то не так делаете...
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
14.12.2016, 10:27  [ТС]
Someone007, Возможно это уже сама память закончилась так как до этого у меня еще создаются большие матрицы, ну я решил проблему немного по иному, там вообще должны были создаватся разряженные матрицы, и я записал их в жатом виде размером [n,3] где первый и второй столбец это координаты элемента масива а третий столбец его значение. и потом реализация перемнажения двух таких жатых матриц. Вообщем если кому интересно могу код скинуть.
Только сейчас такой вопрос: Я создаю 2 сжатые матрицы, потом их перемнажаю и и получаю 3 матрицу, две предедущих больше не нужны, как мне их удалить, освободить память
?

Добавлено через 21 час 39 минут
Неужели нету никаких способов ?
0
Эксперт .NET
 Аватар для Usaga
14311 / 9392 / 1355
Регистрация: 21.01.2016
Сообщений: 35,421
14.12.2016, 10:47
Цитата Сообщение от EgorDybovik Посмотреть сообщение
как мне их удалить, освободить память
?
Никак. За ними придёт сборщик мусора, дядюшка ГЦ, и освободит.
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
14.12.2016, 10:49
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Вообщем если кому интересно могу код скинуть.
Скидывайте.
0
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
14.12.2016, 11:07  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Сжатие
public static double[,] zipMatrix(double[,] A)
        {
            List<int> indx = new List<int>();
            List<int> jndx = new List<int>();
            List<double> val = new List<double>();
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    if(A[i,j]!=0){
                        indx.Add(i+1);
                        jndx.Add(j+1);
                        val.Add(A[i,j]);
                    }
                    
                }
            }
 
            int[] indxI = indx.ToArray();
            int[] indxJ = jndx.ToArray();
            double[] val2 = val.ToArray();
            double[,] res = new double[indxI.Length, 3];
 
            for (int i = 0; i < indxI.Length; i++)
            {
                res[i, 0] = indxI[i];
                res[i, 1] = indxJ[i];
                res[i, 2] = val2[i];
            }
 
            return res;
        }
// Умноже сжатых матриц
// Правда тут из за того что изначально нужно знать размеры результирующей матрицы, то присувствуют два лишних цикла по нахождению максимума в пеивом столбцу первой матрицы(что равно количеству строк в результирующей) и максимальное значение со второго столбца второй матрицы(что равно количеству столбцов результирующей). И это при больших матрицах отнимает слишком много драгоценного времени. У меня примерно 35 секунд, и сейчас я думаю как это можно оптимизировать. но ничего придумать не могу, если у кого нибуть будут какие идеи буду рад усоышать 
public static double[,] multiZipMatrix(double[,] A, double[,] B,bool q) 
        {
            //q = true значит получить zip matrix
            int maxi = 0;
            
            for (int i = 0; i < A.GetLength(0); i++)
                if (A[i, 0] > maxi) maxi = (int)A[i, 0];
 
            int maxj = 0;
            for (int i = 0; i < B.GetLength(0); i++)
                if (B[i, 1] > maxj) maxj = (int)B[i, 1];
            double[,] res = new double[maxi, maxj];
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < B.GetLength(0); j++)
                {
                    if (A[i, 1] == B[j, 0])
                    {
                        res[(int)A[i, 0] - 1, (int)B[j, 1] - 1] = res[(int)A[i, 0] - 1, (int)B[j, 1] - 1] + A[i, 2] * B[j, 2];
                    }
                }
            }
            if (q)
            {
                double[,] res2 = zipMatrix(res);
                return res2;
            }
            else
            {
                return res;
            }
            
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2016, 11:07
Помогаю со студенческими работами здесь

Ошибка System.OutOfMemoryException при загрузки картинки
Здравствуйте. При загрузке большого изображения на pictureBox1 вылетает ошибка нехватки памяти - OutOfMemoryException. Надеялся...

Ошибка OutOfMemoryException
Существует бинарный файл, который я создал сам. Где первые 4 бита это количество элементов в каждом массиве, далее поэлеменнтно записаны 4...

Ошибка System.OutOfMemoryException
Здравствуйте, есть программа в WinForms, работает с текстовиками. вытаскивает данные из одного, обрабатывает по определенному алгоритму...

Ошибка System.OutOfMemoryException
string MX= new string Я понимаю что ошибка выдает исключение о том что не хватает памяти. Вот вопрос - почему? Сколько памяти...

Ошибка System.OutOfMemoryException
Получил вот такую ошибку. Зачем происходит такая ошибка?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru