如何解决使用 sdslite
当元素数量增加到相当大的大小时(大约 50 万个元素需要大约 1 秒,500 万个需要 10 秒),我在将一些带有位置数据的元素写入 netcdf 格式的文件时遇到了一些问题。用于与netcdf文件交互的库是sdsLite,编程语言是F#,但sdslite最初是用C#开发的。
//defining DataSet this happens once in the code...
type Writer = {
Ds : DataSet
First : bool
} with
static member New fp = {
Ds = DataSet ($"{fp}?openMode=create")
First = true
}
//this is called multiple times
let writetodisk (wr : Writer) (arr1 : int [,]) (arr2 : int [,]) (arr3 : int[,]) (arr4 : int[,]) =
if wr.First then
wr.Ds.Add("x",arr1,[| "time"; "element"|])
wr.Ds.Add("y",arr2,[| "time"; "element"|])
wr.Ds.Add("z",arr3,[| "time"; "element"|])
wr.Ds.Add("spawned_by",arr4,[| "time"; "element"|])
else
wr.Ds.Append("x",xAx) |> ignore
wr.Ds.Append("y",yAx) |> ignore
wr.Ds.Append("z",zAx) |> ignore
wr.Ds.Append("spawned_by",sb) |> ignore
wr.Ds.Commit ()
let run () =
let writer = Writer.New "file.nc"
let elements .. //initing 1000000 elements
for i in 0..4800 do
//doing work on elements...
writetodisk writer elements.X elements.Y elements.Z elements.SpawnedBy
在每个输入数组中使用 1M 元素运行 writetodisk 函数时,每次写入大约需要 9 秒。由于我必须为程序的单次运行编写大约 4800 次,因此这显然会很糟糕。
我想我可以尝试并行运行它,但似乎 sdslite 不允许这样做,因为此代码:
[|
async {
if wr.First then
wr.Ds.Add("x",[|"time"; "particle";|]) |> ignore
else
wr.Ds.Append("x",arr1) |> ignore
}
async {
if wr.First then
wr.Ds.Add("y",[|"time"; "particle";|]) |> ignore
else
wr.Ds.Append("y",arr2) |> ignore
}
async {
if wr.First then
wr.Ds.Add("z",[|"time"; "particle";|]) |> ignore
else
wr.Ds.Append("z",arr3) |> ignore
}
async {
if wr.First then
wr.Ds.Add("spawned_by",[|"time"; "particle";|]) |> ignore
else
wr.Ds.Append("spawned_by",arr4) |> ignore
}
|]
|> Async.Parallel
|> Async.RunSynchronously
|> fun x -> wr.Ds.Commit ()
在 SDSlite 中引发异常:Microsoft.Research.Science.Data.NetCDF4.NetCDFException: String match to name in use
我还能做些什么来加快速度吗?我对 HPC 还很陌生,此刻我感到有些失落。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。