【问题标题】:Parallel for loop to add points to series resulting in index outside the bounds of array并行 for 循环将点添加到系列中,导致索引超出数组范围
【发布时间】:2019-01-15 13:34:31
【问题描述】:
int signal_length=1000_000;
double[] x=new double[signal_length];

var Signal = new Series
{
    IsVisibleInLegend = true,
    ChartType = SeriesChartType.Line,
    LegendText = "Original Signal",
};

var options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.For(0, x.Length,options, i =>
{
  Signal.Points.AddY(x[i]);
});

chart.Series.Add(Signal);

错误信息:

System.IndexOutOfRangeException: '索引超出了数组的范围。'

我认为这个错误是由于并行循环不是原子的
我想要 C++ 中的“REDUCTION”之类的东西

【问题讨论】:

  • 每个并行进程应该是 x.Length/4。起点 0 也必须改变。
  • 我的猜测是异常发生在Points.AddY 内部。请通过发布异常的堆栈跟踪来确认这种怀疑。如果是,则贴出AddY 方法的源代码。它很可能没有实现线程安全,
  • 发布的代码看起来甚至不适合并行性.. Parallel.For 不是“减少”,因此不确定如何显示声称的目标。
  • @jdweng 不,Parallel.For(0, x.Length, ... 是正确的
  • 为什么你认为Signal.Points.AddY 是线程安全的?图表系列是线程安全的是没有意义的。顺序是图表中最重要的东西之一

标签: c# multithreading parallel-processing mschart


【解决方案1】:

图表控件不是线程安全的。您不能简单地从多个线程并行调用它的函数。

使用DataBindY 方法一次添加多个数据点。为了提高性能,DataBind* 方法在内部使用SuspendUpdates / ResumeUpdates 来防止在添加数据点时重绘图表。

与 Microsoft 实施其DataBind* 方法的方式相比,无法提高性能。


性能测量:

double[] x = new double[1_000_000];
Random r = new Random();

for (int i = 0; i < x.Length; i++)
{
    x[i] = r.NextDouble();
}

var Signal = new Series
{
    IsVisibleInLegend = true,
    ChartType = SeriesChartType.Line,
    LegendText = "Original Signal",
};

DateTime start = DateTime.Now;

Signal.Points.DataBindY(x);

DateTime end = DateTime.Now;

MessageBox.Show((end - start).TotalMilliseconds.ToString());

这段代码表明,在我的计算机上使用DataBindY 添加数据点需要大约 1600 毫秒。我看不出你如何改进这部分。

如果您发现实际绘制图表的性能很慢,则必须通过减少数据点的数量来寻求改进。例如,完全限制点数或仅包括每个第 n 个数据点。

【讨论】:

  • 实际上 x 值是从二进制文件中读取的我想以并行方式添加它们以节省时间我可以绑定它们一次但使用Signal.Points.DataBindY(x)以顺序模式进行
  • @Dev.Mahmood 好的,这是不可能的。图表控件不是线程安全的。没有办法通过并行化加速添加值,只能通过一次添加所有值。
  • @Reniuz 确定我是并行读取文件的,但它的价值超过 100 万,绘制它大约需要 10 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2019-04-17
  • 2021-12-15
相关资源
最近更新 更多