在S4类中创建并行集群

时间:2012-10-28 17:03:22

标签: multithreading r class parallel-processing s4

  

可能重复:
  S4 Classes: Multiple types per slot

我正在尝试制作我的第一个R包。 我计划创建一个S4类“测试”,其中包含数据和一些处理数据的方法。 就我而言,可以通过多线程改进数据处理。 我测试了parLapply(),它提高了性能。

问题在于我不想打电话:

cl <- makeCluster(N)
parLapply(cl, x, FUN, ...)
stopCluster(cl)

在每个我希望并行的方法中。这是因为它不优雅,并且我认为,线程成本团队的重复创建(和破坏)。

因此,我正在思考(简单地)在我的班级“测试”中有一个cluster对象。 然后我可以,例如,制作一个“测试”对象“o”并调用“test”方法setNumbrOfThreads(o) <- 4

但是,我在执行方面遇到了麻烦。由于?makeCluster()表示返回值是'''类'c(“SOCKcluster”,“cluster”)'''的对象,我试过:

setClass("test",
    representation(
        data = "list",
        nThreads = "numeric",
        cluster = c("SOCKcluster", "cluster") #This seems incorrect
    ),
    prototype(
        data = NULL,
        nThreads = 1,
        cluster = makeCluster(1) # "cluster = NULL" does not help
    )
) 

R抱怨element 3 of the representation was not a single character string 。 所以我尝试了没有更多成功:cluster = "cluster"cluster = "SOCKcluster"(代表)。

我的问题是:

如何创建一个包含c类成员对象的S4类(“SOCKcluster”,“cluster”)?

谢谢,

1 个答案:

答案 0 :(得分:1)

布兰登询问将不同类型的物品('apple','orange')放入一个槽中;你问的是在S4对象中使用S3类。符号c("SOCKcluster", "cluster")是S3表示SOCKcluster包含cluster作为父类的方式。这是Example of Using an S3 Class in a S4 ObjectS4 Classes: Multiple types per slot而不是的{{3}}的副本,并且有一个扭曲 - 你有一个(短)S3类层次结构,而不仅仅是一个S3类。然而,解决方案具有相同的精神,

setOldClass(c("SOCKcluster", "cluster"))
A = setClass("A", representation(cluster="SOCKcluster"))

然后

> library(parallel)
> a = A(cluster=makePSOCKcluster(2))
> a
An object of class "A"
Slot "cluster":
socket cluster with 2 nodes on host 'localhost'

尝试将MPI群集(需要snowRmpi)放入您的类失败

> a = A(cluster=makeCluster(2, "MPI"))
    2 slaves are spawned successfully. 0 failed.
Error in validObject(.Object) : 
  invalid class "A" object: 1: invalid object for slot "cluster" in class "A": got class "spawnedMPIcluster", should be or extend class "SOCKcluster"
invalid class "A" object: 2: invalid object for slot "cluster" in class "A": got class "MPIcluster", should be or extend class "SOCKcluster"
invalid class "A" object: 3: invalid object for slot "cluster" in class "A": got class "cluster", should be or extend class "SOCKcluster"

创建支持cluster的类需要阅读?setOldClass