【问题标题】:ZedGraph plotting large amount of dataZedGraph 绘制大量数据
【发布时间】:2013-09-06 12:31:30
【问题描述】:

嗨。

            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 mb 的文件。我正在读取字节并将数据写入缓冲区,因此buffer.lenght 得到一个很大的数字。因此程序由于长 for 循环而抛出内存异常。如何在不占用内存异常的情况下绘制所有字节。?

【问题讨论】:

    标签: c# for-loop bytearray zedgraph


    【解决方案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);
    }
    

    如果放大,则需要重新计算点列表,以免最终得到锯齿线。

    【讨论】:

    • 我将一些值设置为 maxWidth,它们是 128,256,1024,4096。所有值的数据看起来都很好,但我想知道我是否应该根据文件大小更改此值?您对 maxWidth 值有什么建议吗?
    • 您不需要根据文件大小更改maxWidth,而是以像素为单位更改图形的宽度。如果您想修复该值,我建议使用 1920、2560 或 4096。
    • 看看FilteredPointList。您可以将缓冲区加载到其中,然后设置数据的边界和要显示的点数。只要您有记忆,这将消除必须刷新点列表的一些复杂性。您现在只需在窗口边界超出您的数据时更新您的列表。
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多