r—共享数据.内存中用于并行计算的表



关于数据的帖子。表和并行计算,我试图找到一种方法来得到一个操作的data.table并行化。

我有一个data.table,有400万行14个观察值,并希望在公共内存中共享它,以便通过使用parLapply 的"并行"包来并行化对它的操作,而不必为集群中的每个节点复制表(parLapply所做的)。目前,移动data.table的成本比并行计算的好处要大。

我发现"bigmemory"包作为共享内存的答案,但它不维护"数据"。表"-数据的结构。有没有人知道如何:

1)把data.table放到共享内存

2)维护"数据"。表"-这样做的数据结构

3)使用并行处理的data.table ?

提前感谢!

老问题,但这里有一个答案,因为没有人回答过,它可能会有所帮助。我假设您遇到的问题是因为您在windows上并且必须使用PSOCK类型的集群。不幸的是,对于windows,这意味着您必须将数据复制到每个节点。然而,有一种解决方法。获取docker并在docker虚拟机上启动一个Rserve实例(例如stevenpollack/docker-rserve)。因为这是基于linux的,所以你可以在docker虚拟机上创建一个FORK集群。然后,使用本机R实例,您可以只发送一次数据副本到Rserve实例(查看RSclient库),在vm上执行并行化作业,并将结果收集回本机R。

解决方案,从多个进程共享读写访问,以及它们的问题讨论在这里:https://github.com/Rdatatable/data.table/issues/3104

正如rookie提到的,如果你fork一个R进程(使用parallel::makeCluster(type = "FORK")future::plan(multicore)(注意这在RStudio中不可靠),操作系统将重用未被子进程修改的内存页面。因此,您的工作人员将共享相同的内存,只要他们不修改它(写时复制)。但是,只有当所有并行工作线程都在同一台机器上并且fork()有自己的问题时(尽管如果您只是想进行一些并行分析,这可能太过分了),这才有效。

同时,您可以发现featherfst包很有趣。feather提供了一种R和python都可以读取的文件格式,如果我对文档的理解正确的话,feather::feather()提供了一个文件支持的只读数据帧,尽管没有data.table。这允许在这两种语言之间移动数据。

fst采用Zstandard压缩算法,实现对磁盘非常快的读写速度。您可以使用fst()函数(而不是read_fst())读入第一个文件的一部分。因此,每个worker只能读取它需要的表的一部分。并发写入第一个文件是不可能的。您需要将每个结果保存在单独的文件中,然后将它们连接起来。

或者,对于并发读写,您可以切换到数据库,尽管这比data.table慢。参见SO/SQLite并发访问

最新更新