Как Избавиться От Ошибки Переполнения Памяти?

tumanovalex

Active member
17.06.2009
26
0
#1
Считываю данные short из файла 29 мб и затем вывожу их на график:
C++:
	 private void file_read(string file_name)
{
try
{
reader = new BinaryReader(new FileStream(file_name, FileMode.Open, FileAccess.Read, FileShare.Read));
}
catch (FileNotFoundException e)
{
MessageBox.Show(e.Message.ToString(), "Ошибка!!!", System.Windows.Forms.MessageBoxButtons.OK,
System.Windows.Forms.MessageBoxIcon.Error);
Environment.Exit(1);
}
long file_size = reader.BaseStream.Seek(0, SeekOrigin.End);
num_elem = file_size / sizeof(Int16);
reader.BaseStream.Seek(0, SeekOrigin.Begin);
data = new short[num_elem];
for (int i = 0; i < num_elem; i++)
{
data[i] = reader.ReadInt16();
}
reader.Close();
}

private void file_show(Int16[] data)
{
s = new Series("Sources");
s.ChartType = SeriesChartType.Spline;
s.Color = Color.Red;
for (long i = 0; i < num_elem; i++)
{
s.Points.AddXY(i, data[i]); // Ошибка
}
chart1.Series.Add(s);
chart1.Visible = true;
chart1.Show();
this.Refresh();
}
В строке s.Points.AddXY(i, data) возникает ошибка: "An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Windows.Forms.DataVisualization.dll. Вроде бы файл не такой огромный. На компьютере в разделе Система размер ОЗУ оценивается как 3 gb и доступно 2,7 gb. Подскажите, пожалуйста, как исправить программу. Проект (без файла данных) прилагаю, файл данных 29 мб разместил на
Для просмотра контента необходимо: Войти или зарегистрироваться
 

Вложения

LuMee

Well-known member
02.05.2006
477
0
#2
Судя по всему, вы пытаетесь добавить 14 миллионов точек на график, а каждая точка - это не просто число, а еще и определенный объем ресурсов, требуемых для отображения в чарте. Думаю, тут есть смыл хорошенько задуматься: вам реально нужно все эти точки на графике нарисовать? Ибо слабо себе представляю монитор, на котором их все можно будет разглядеть.

Необходимо, в общем, пересмотреть подход к визуализации. Варианты с ходу:
1. показывать только фрагмент графика (скажем, тысячу точек) с возможностью скроллинга к следующему/предыдущему фрагменту;
2. отображать некоторую аппроксимацию вашей последовательности с меньшим количеством точек. Алгоритм построения такой аппроксимации надо хорошенько обмозговать; он будет зависеть от ваших данных.