С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
1

Ошибка OutOfMemoryException

30.08.2016, 15:47. Показов 1820. Ответов 10
Метки нет (Все метки)

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void Save_bin(List<double> s1, List<double> s2, List<double> s3, List<double> s4)
        {
            using (BinaryWriter writer = new BinaryWriter(File.Open(Setting.getPath() + Setting.getNamefile()+".dat", FileMode.Create)))
                {
                 writer.Write(Convert.ToInt32(s1.Count));                  
                    for (int i = 0; i < s1.Count; i++)
                    {
                        writer.Write(s1[i]);
                        writer.Write(s2[i]);
                        writer.Write(s3[i]);
                        writer.Write(s4[i]);
                    }                                      
                 }
               
            }
            
        }
Файл получился довольно громоздким. Размер его около 800 метров.
И при считывании:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void Read_bin(List<double> s1, List<double> s2, List<double> s3, List<double> s4, string path)
        {
            int count;
            using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
            {
                count = reader.ReadInt32();
                for (int i = 0; i < count; i++)
                {
                    s1.Add(reader.ReadDouble());
                    s2.Add(reader.ReadDouble());
                    s3.Add(reader.ReadDouble());
                    s4.Add(reader.ReadDouble());
                }
            }
        }


Вылетает ошибка OutOfMemoryException, не хватка памяти, как избежать подобное? не подскажите?
0
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
30.08.2016, 15:47
Ответы с готовыми решениями:

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

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

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

Ошибка System.OutOfMemoryException - как обойти?
Добрый день. На данный момент в коде в 2-х местах встречаются подобные исключения, т.е. как я...

10
Администратор
Эксперт .NET
17711 / 13838 / 5313
Регистрация: 17.03.2014
Сообщений: 28,344
Записей в блоге: 1
30.08.2016, 16:06 2
timur-chak, попробуй выделить память под массив заранее и один раз путем установки Capacity.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void Read_bin(List<double> s1, List<double> s2, List<double> s3, List<double> s4, string path)
{
    using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
    {
        int count = reader.ReadInt32();
        s1.Capacity = s2.Capacity = s3.Capacity = s4.Capacity = count; 
        for (int i = 0; i < count; i++)
        {
            s1.Add(reader.ReadDouble());
            s2.Add(reader.ReadDouble());
            s3.Add(reader.ReadDouble());
            s4.Add(reader.ReadDouble());
        }
    }
}
Добавлено через 3 минуты
P.S. Я исходил из того что списки изначально пустые. Если это не так, то к Capacity нужно добавить count.
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
30.08.2016, 16:28  [ТС] 3
OwenGlendower, Так, ваш способ помог, спасибо, но возникла новая проблема, все эти данные я хотел выводить на графики с помощью библиотеки zedGraph. Дак вот, ударился об новую ошибку.

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
FileWork.Read_bin(input_signal1, input_signal2, input_signal3, input_signal4, Tb_path.Text);
            GraphPane pane1 = chanel_1.GraphPane;
            GraphPane pane2 = chanel_2.GraphPane;
            GraphPane pane3 = chanel_3.GraphPane;
            GraphPane pane4 = chanel_4.GraphPane;
            pane1.CurveList.Clear();
            pane2.CurveList.Clear();
            pane3.CurveList.Clear();
            pane4.CurveList.Clear();
            double[] x = new double[input_signal1.Count];
            for (int n = 0; n < input_signal1.Count; n++)
            {
                x[n] = n;
            }
            LineItem myCurve1 = pane1.AddCurve("test", x, input_signal1.ToArray(), Color.Blue, SymbolType.None);
            LineItem myCurve2 = pane2.AddCurve("test", x, input_signal2.ToArray(), Color.Blue, SymbolType.None);
            LineItem myCurve3 = pane3.AddCurve("test", x, input_signal3.ToArray(), Color.Blue, SymbolType.None);
            LineItem myCurve4 = pane4.AddCurve("test", x, input_signal4.ToArray(), Color.Blue, SymbolType.None);
            
            chanel_1.AxisChange();
            chanel_1.Invalidate();
                        
            chanel_2.AxisChange();
            chanel_2.Invalidate();
                        
            chanel_3.AxisChange();
            chanel_3.Invalidate();
            
            chanel_4.AxisChange();
            chanel_4.Invalidate();
Где Read_bin показанный ранее код для прочтения бинарника

Ошибка вылетает при добавлении линии на график (AddCurve)
0
Администратор
Эксперт .NET
17711 / 13838 / 5313
Регистрация: 17.03.2014
Сообщений: 28,344
Записей в блоге: 1
30.08.2016, 16:35 4
Цитата Сообщение от timur-chak Посмотреть сообщение
Ошибка вылетает при добавлении линии на график (AddCurve)
Снова OufOfMemoryException?
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
30.08.2016, 16:40  [ТС] 5
OwenGlendower, да, снова
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.08.2016, 16:47 6
Цитата Сообщение от timur-chak Посмотреть сообщение
Вылетает ошибка OutOfMemoryException, не хватка памяти, как избежать подобное? не подскажите?
Не нужно загружать 800 метровые файлы в память. И тем более пытаться их отображать в графиках.
Прямолинейные методы, которые годятся для малых данных не работают для больших.
Поэтому большие данные требуют кардинально других подходов. Как математических, так и программистских. К ним относятся сжатие, индексация, редукция, усреднение, кластеризация и множество других методов.
Например, зачем вам выводить сотни миллионов значений на график (на котором рассмотреть такое число данных невозможно в принципе)? Сделайте выжимку данных - например среднее значение на каждые 100 значений и выведите их.
Аналогично, загружать все 800 мбайт в память- зачем? Что вы с ними будете делать? Обычно это последствия слишком прямолинейного и бездумного подхода к обработке данных.
2
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
30.08.2016, 16:50  [ТС] 7
OwenGlendower, Видимо придется выводить только часть графика, добавлять какой-нибудь элемент управления, скрол бар например, что бы двигать его..ой как не хотелось бы это делать..

Добавлено через 1 минуту
Storm23, идея была преобразовывать файл в дальнейшем в другие форматы, например в .mat
А вывод на график данных, вы правы можно делать например децимацию, попробую
0
Администратор
Эксперт .NET
17711 / 13838 / 5313
Регистрация: 17.03.2014
Сообщений: 28,344
Записей в блоге: 1
30.08.2016, 16:53 8
timur-chak, возможно это из-за вызова ToArray() для списков. Переделай метод Read_bin на массивы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void Read_bin(out double[] s1, out double[] s2, out double[] s3, out double[] s4, string path)
{
    using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
    {
        int count = reader.ReadInt32();
        s1 = new double[count];
        s2 = new double[count];
        s3 = new double[count];
        s4 = new double[count];
        for (int i = 0; i < count; i++)
        {
            s1[i] = reader.ReadDouble();
            s2[i] = reader.ReadDouble();
            s3[i] = reader.ReadDouble();
            s4[i] = reader.ReadDouble();
        }
    }
}
И переделай использование:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double[] input_signal1, input_signal2, input_signal3, input_signal4;
FileWork.Read_bin(out input_signal1, out input_signal2, out input_signal3, out nput_signal4, Tb_path.Text);
 
GraphPane pane1 = chanel_1.GraphPane;
GraphPane pane2 = chanel_2.GraphPane;
GraphPane pane3 = chanel_3.GraphPane;
GraphPane pane4 = chanel_4.GraphPane;
pane1.CurveList.Clear();
pane2.CurveList.Clear();
pane3.CurveList.Clear();
pane4.CurveList.Clear();
 
// Заменил double на int для экономмии памяти
int[] x = new int[input_signal1.Count];
for (int i = 0; i < input_signal1.Count; i++) x[i] = i;
 
LineItem myCurve1 = pane1.AddCurve("test", x, input_signal1, Color.Blue, SymbolType.None);
LineItem myCurve2 = pane2.AddCurve("test", x, input_signal2, Color.Blue, SymbolType.None);
LineItem myCurve3 = pane3.AddCurve("test", x, input_signal3, Color.Blue, SymbolType.None);
LineItem myCurve4 = pane4.AddCurve("test", x, input_signal4, Color.Blue, SymbolType.None);
 
// Далее без изменений ...
Добавлено через 1 минуту
Цитата Сообщение от Storm23 Посмотреть сообщение
Поэтому большие данные требуют кардинально других подходов. Как математических, так и программистских. К ним относятся сжатие, индексация, редукция, усреднение, кластеризация и множество других методов.
+1!
1
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.08.2016, 16:53 9
Цитата Сообщение от timur-chak Посмотреть сообщение
идея была преобразовывать файл в дальнейшем в другие форматы, например в .mat
Для этого совсем не обязательно загружать весь файл в память. Читайте мелкими кусочками и конвертируйте куда угодно.
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
30.08.2016, 17:13  [ТС] 10
OwenGlendower, Storm23, подскажите пожалуйста в случае с List как его удалить из памяти, метод Clear(); Этого не делает

Добавлено через 6 минут
OwenGlendower, У массива вместо Count Length, и к сожалению на int не заменить, так как входной параметр только double

Добавлено через 1 минуту
OwenGlendower, Меняя лист на массив, проблема та же, помогла децимация исходного сигнала. Но все это не правильно, наверное, как говорит Storm23.
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.08.2016, 17:13 11
Цитата Сообщение от timur-chak Посмотреть сообщение
подскажите пожалуйста в случае с List как его удалить из памяти, метод Clear(); Этого не делает
Если кратко - никак. Wecome to .NET world
Можно поиграться с GC.Collect. Но это не решит ваших проблем.
Цитата Сообщение от timur-chak Посмотреть сообщение
идея была преобразовывать файл в дальнейшем в другие форматы, например в .mat
Технически этого можно достигнуть, например используя yield и возвращая IEnumerable<double>, вместо double[]. И тогда память вообще не будет расходоваться (если конечно вы снова все не запихнете в массив).
И вообще, для экономии памяти всегда, где только можно, нужно уходить от массивов и использовать итераторы.
1
30.08.2016, 17:13
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
30.08.2016, 17:13
Помогаю со студенческими работами здесь

Ошибка OutOfMemoryException при создании матрицы
Пытаюсь создать матрицу maxi = 14357 maxj = 2515 double res = new double; Выдает ошибку...

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

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

Занимаемая память приложения. System.OutOfMemoryException: "Выдано исключение типа "System.OutOfMemoryException"."
Спустя несколько часов работы приложения выдаёт вот такую ошибку: System.OutOfMemoryException:...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Блоги программистов
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(шес­­­­­­­­­­­­­­­ти­б­и­т­н­ы­й асихронный счётчик с управляющим сигналом заде
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
Angular vs React vs Vue.js
BasicMan 03.01.2025
О, друзья-разработчики и просто любопытные читатели! Сегодня мы отправимся в увлекательное путешествие по миру фронтенд-разработки, и первой остановкой станет Angular – этакий строгий немецкий. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru