关于数据的帖子。表和并行计算,我试图找到一种方法来得到一个操作的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()
有自己的问题时(尽管如果您只是想进行一些并行分析,这可能太过分了),这才有效。
同时,您可以发现feather
和fst
包很有趣。feather
提供了一种R和python都可以读取的文件格式,如果我对文档的理解正确的话,feather::feather()
提供了一个文件支持的只读数据帧,尽管没有data.table
。这允许在这两种语言之间移动数据。
fst
采用Zstandard压缩算法,实现对磁盘非常快的读写速度。您可以使用fst()
函数(而不是read_fst()
)读入第一个文件的一部分。因此,每个worker只能读取它需要的表的一部分。并发写入第一个文件是不可能的。您需要将每个结果保存在单独的文件中,然后将它们连接起来。
或者,对于并发读写,您可以切换到数据库,尽管这比data.table慢。参见SO/SQLite并发访问