问题描述
当前,我正在使用来自doparallel库的foreach循环来跨同一台计算机的多个内核并行运行函数调用,如下所示:
out_results=foreach(i =1:length(some_list))%dopar%
{
out=functions_call(some_list[[i]])
return(out)
}
此 some_list 是数据帧的列表,每个数据帧将具有不同数量的列,function_call()是对数据执行多项操作(例如数据操作)的函数,然后使用随机森林进行变量选择,然后最终执行最小二乘拟合。变量 out 还是3个数据帧的列表,而 out_results 将是列表的列表。 我正在使用CRAN库和我在函数调用中创建的一些自定义库,由于它们的功能有限和整个代码的重写,我想避免使用spark ML库。
我想利用spark并行运行这些函数调用。可以这样做吗?如果是,我应该朝哪个方向思考。我已经阅读了Sparklyr的许多文档,但由于那里提供的示例非常简单,因此似乎并没有太大帮助。
解决方法
SparklyR's homepage给出了在Spark集群上分发的任意R代码的示例。特别是,请参见其有关分组操作的示例。
您的主要结构应该是一个数据框,您将按行对其进行处理。可能类似于以下内容(未经测试):
[Test] //fails
public void MyAsyncTest()
{
TestDelegate testDelegate = async () => await MyTestMethod();
Assert.That(testDelegate,Throws.Exception);
}
[Test] //passes
public void MyAsyncTest2()
{
Assert.That(async () => await MyTestMethod(),Throws.Exception);
}
private async Task MyTestMethod()
{
await Task.Run(() => throw new Exception());
}
总而言之,这种方法似乎是不自然的,好像我们在一个不合适的任务上强迫使用Spark一样。也许您应该检查另一个并行化框架?