ZedGraph отображает большой объем данных

Hi.

            PointPairList list = new PointPairList();
            LineItem myCurve = myPane.AddCurve("My Curve", list, Color.Blue,
                                    SymbolType.None);
            for (int x = y; x < buffer.Length; x++)
            {
                list.Add(x, buffer[x]);
            }

У меня есть файл его размер 40 мб. Я читаю байты и записываю данные в буфер, поэтому buffer.lenght получает большое число. Таким образом, программа выдает исключение из памяти из-за длинного цикла for. Как я могу нарисовать все байты, не вынимая исключения из памяти?


person Blast    schedule 06.09.2013    source источник


Ответы (1)


Вам нужно будет предварительно обработать массив байтов, создав меньший набор данных, который в 2 раза превышает максимальную ширину по горизонтали или вашу диаграмму.

Чтобы отобразить диаграмму шириной maxWidth в пикселях, выполните что-то подобное.

int window = (buffer.Length / maxWidth) + 1;

for (int x = 0; x < buffer.Length; x += window)
{
    double min = double.MaxValue;
    double max = double.MinValue;

    for (int j = 0; j < window; j++)
    {
        int index = x + j;

        if (index < buffer.Length)
        {
            double value = buffer[x+j];
            if (value < min)
            {
                min = value;
            }

            if (value > max)
            { 
                max = value;
            }
        }
    }

    list.Add(x, min);
    list.Add(x + (window - 1), max);
}

Если вы увеличиваете масштаб, вам нужно пересчитать список точек, чтобы вы не получили линию зуба пилы.

person discomurray    schedule 06.09.2013
comment
Я установил некоторые значения maxWidth, это 128 256 1024 4096. Данные выглядят нормально для всех значений, но я хочу знать, следует ли изменить это значение в соответствии с размером файла? У вас есть предложение о значении maxWidth? - person Blast; 10.09.2013
comment
Вам не нужно изменять maxWidth в соответствии с размером файла, а только ширину графика в пикселях. Я бы предложил 1920, 2560 или 4096, если вы хотите исправить значение. - person discomurray; 11.09.2013
comment
Взгляните на FilteredPointList. Вы можете загрузить в него свой буфер, затем установить границы данных и количество отображаемых точек. Пока у вас есть память, это избавит вас от необходимости обновлять список точек. Вам нужно только обновить свой список сейчас, когда границы окна превышают ваши данные. - person Nathan Phetteplace; 03.06.2014