集群上的R使用内存虚拟化

时间:2014-07-26 03:59:38

标签: r memory-management parallel-processing cluster-computing

我几乎不了解并行计算的所有内容,所以这个问题可能非常愚蠢,也许不可能做我想做的事。

我正在使用具有40个节点的Linux集群,但由于我不知道如何在R中编写并行代码,因此我仅限于使用一个。在这个节点上,我试图分析泛滥内存的数据(大约64GB)。所以我的问题不是缺乏计算能力,而是内存限制。

我的问题是,是否有可能使用一些R包(如doSnow)进行隐式并行化以使用2-3个节点来增加RAM限制,或者我是否必须从地面重写脚本以使其显式并行化?

对不起,如果我的问题很幼稚,欢迎任何建议。

谢谢,

西蒙

3 个答案:

答案 0 :(得分:3)

我认为没有这样的套餐。原因是拥有一个没有多大意义。内存访问速度非常快,与此相比,通过网络从另一台计算机访问数据的速度非常慢。因此,如果存在这样的包,它几乎是无用的,因为处理器需要一直等待网络上的数据,这将使计算非常慢。

对于使用现成硬件构建的通用计算群集,情况确实如此。如果您碰巧有一个特殊的集群,远程内存访问速度很快,并且是作为操作系统的服务提供的,那么它当然可能并不那么糟糕。

否则,您需要做的是尝试将问题分成多个部分,手动,然后使用R或其他工具进行并行化。

另一种方法是将一些数据保留在磁盘上,而不是将所有数据加载到内存中。在加载另一部分数据之前,你仍然需要(有点)划分问题,以确保内存中的数据部分在合理的时间内用于计算。

是否值得(或根本不可能)执行这些选项中的任何一个,完全取决于您的应用程序。

顺便说一下。 R中的高性能计算工具列表如下: http://cran.r-project.org/web/views/HighPerformanceComputing.html

答案 1 :(得分:1)

未来查询:

您可能想看看“snow”和“parallel”这两个包。 库“snow”扩展了 apply/lapply/sapply... 的功能,可以在多个核心和/或一个节点上工作。

当然,您可以使用多个内核执行简单的并行计算:

#SBATCH --cpus-per-task=(在此处输入一些数字)

您还可以使用多个节点(最好使用前面提到的库)执行并行计算:

#SBATCH --ntasks-per-node=(在此处输入一些数字)

但是,对于一些含义,您可能想考虑使用 Python 而不是 R,因为使用“Dask”worker 可以使并行性更高效。

答案 2 :(得分:0)

您可能需要查看TidalScale,它可以允许您聚合群集上的节点,以使用底层节点的集合资源运行单个Linux实例。 www.tidalscale.com。虽然R应用程序可能本质上是单线程的,但您可以为您的R应用程序提供跨节点的单个,简单的连贯内存空间,这对您的应用程序是透明的。

祝你的项目好运!