none
C# и WinForms - как избавиться от ошибки переполнения памяти? RRS feed

  • Вопрос

  • Считываю данные short из файла 29 мб и затем вывожу их на график:

         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[i]) возникает ошибка: "An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Windows.Forms.DataVisualization.dll. Вроде бы файл не такой огромный. На компьютере в разделе Система размер ОЗУ оценивается как 3 gb и доступно 2,7 gb. Подскажите, пожалуйста, как исправить программу. Проект по ссылке https://yadi.sk/d/qBuDNe_RbYK24 файл с данными разместил на https://yadi.sk/d/rAf-a3_DbYBYz

    Alex

    18 сентября 2014 г. 15:04

Ответы

  • Добрый день.

    Вполне возможно, что в Chart есть ограничение на длинну массива с данными. Если у вас данные меняются не сильно, то попробуйте выводить в Chart данные не по всем точкам, а 1 из n. Если данные обладают сильно выраженными аномалиями которые вас и интересуют, то попробуйте использовать другие контролы для отображения графиков.


    19 сентября 2014 г. 5:48
    Отвечающий
  • Сложно сказать. Раз котрол падает по OutOfMemory, то скорее всего только опытным путем. Видимо с отрисовкой какие-то проблемы... Т.к. просто точки в памяти, как вы правильно заметили, должны помещаться корректно...
    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 6:07
    19 сентября 2014 г. 6:05
    Отвечающий

Все ответы

  • Добрый день.

    Вполне возможно, что в Chart есть ограничение на длинну массива с данными. Если у вас данные меняются не сильно, то попробуйте выводить в Chart данные не по всем точкам, а 1 из n. Если данные обладают сильно выраженными аномалиями которые вас и интересуют, то попробуйте использовать другие контролы для отображения графиков.


    19 сентября 2014 г. 5:48
    Отвечающий
  • Спасибо большое за отличную ссылку. А как бы узнать эти ограничения, чтобы в дальнейшем их учитывать?


    Alex


    • Изменено tumanovalex 19 сентября 2014 г. 6:06
    19 сентября 2014 г. 6:02
  • Сложно сказать. Раз котрол падает по OutOfMemory, то скорее всего только опытным путем. Видимо с отрисовкой какие-то проблемы... Т.к. просто точки в памяти, как вы правильно заметили, должны помещаться корректно...
    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 6:07
    19 сентября 2014 г. 6:05
    Отвечающий
  • Спасибо за помощь. Попробую другие контролы.

    Alex

    19 сентября 2014 г. 6:07
  • GC.SuppressFinalize(chart1);
    GC.Collect();