我正在学习使用F#Live Charting并且难以使代码并行。
我有这个代码,我在一些谷歌搜索的一些例子的帮助下写过。
module liveChartData =
let SampledData (tuple) (t:int) =
let name = tuple |> fst
let stat = tuple |> snd
let x = [for i in all.GetColumn<float>((name,stat)).Keys -> i.ToShortDateString()]
let y = all.GetColumn<float>((name,stat)) |> Series.fillMissingWith 0. |> Series.values
let obs =
seq { for i in (Seq.zip x y) do
do Thread.Sleep t
yield (i) } |> Seq.cache |> Seq.observe
"" + name + "-" + stat + "",obs
let dataSort (id:string) =
let name = all.ColumnKeys |> Seq.map fst |> Seq.distinct |> Seq.toList
let stat = all.ColumnKeys |> Seq.map snd |> Seq.distinct |> Seq.toList
[|for i in name do for j in stat -> (i,j)|]
|> Array.filter (fun i -> (i |> snd) = id)
let prepData (stats:string) =
[|for i in (dataSort stats) -> i|]
|> Array.map (fun i -> let data = liveChartData.SampledData i 200
LiveChart.FastLineIncremental(data |> snd,data |> fst))
|> Chart.Combine
let charting_s=
[|for i in ["col1"; "col2";"col3";"col4"; "col5"] -> i|]
|> Array.map (fun i -> prepData i)
|> Chart.Rows
当我将Array.map更改为Array.Parallel.map时,我收到以下错误。
System.InvalidOperationException: Chart Area Axes - The minimum and maximum axis values have not been specified.
也得到了
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
尝试使其他部分并行我也会遇到其他错误。 似乎在将数据并行提供给LiveChart.FastLineIncremental时会出现问题。 我也认为代码可以从某种异步过程中受益,但我不知道如何合并它。
非常感谢任何帮助。
此代码可以正常工作,但我只想使用我的所有内核。
答案 0 :(得分:0)
尝试将Array.Parallel.map向上移动一级,以便并行创建数据,然后在同一个线程上创建图表行。
这样的事情:
let prepData (stats:string) =
[|for i in (dataSort stats) -> i|]
|> Array.Parallel.map (fun i -> liveChartData.SampleData i 200)
|> Array.map (fun data -> LiveChart.FastLineIncremental(data |> snd, data |> fst))