Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在foreach内部运行ggplot比只使用for循环运行要慢_R_Ggplot2_Foreach_Spatial_Doparallel - Fatal编程技术网

在foreach内部运行ggplot比只使用for循环运行要慢

在foreach内部运行ggplot比只使用for循环运行要慢,r,ggplot2,foreach,spatial,doparallel,R,Ggplot2,Foreach,Spatial,Doparallel,我正在绘制一个数据集的地图,在ggplot中有2000万个数据点。一张地图(带有刻面)需要10-15分钟,所以我检查了在并行模式下使用多个内核是否会更好。使用foreach制作地图需要更多的时间。一些foreach运行了30分钟-1小时,没有产生任何结果。我知道,这个问题()的答案表明,在并行计算中,有时合并独立并行进程的结果比运行任务本身需要更多的时间。但是当我在寻找可以改进的分钟跑步时,我看到了一些跑步的例子。你认为有可能吗 由于我拥有大量数据,我对数据集进行了采样: structure(l

我正在绘制一个数据集的地图,在ggplot中有2000万个数据点。一张地图(带有刻面)需要10-15分钟,所以我检查了在并行模式下使用多个内核是否会更好。使用foreach制作地图需要更多的时间。一些foreach运行了30分钟-1小时,没有产生任何结果。我知道,这个问题()的答案表明,在并行计算中,有时合并独立并行进程的结果比运行任务本身需要更多的时间。但是当我在寻找可以改进的分钟跑步时,我看到了一些跑步的例子。你认为有可能吗

由于我拥有大量数据,我对数据集进行了采样:

structure(list(lat = c(46.791667, 52.958333, 57.375, 62.625, 
74.041667, 60.208333, 30.208333, 56.791667, 57.375, 40.958333, 
56.541667, 38.958333, 35.291667, 43.625, 71.375, 66.875, 74.375, 
66.458333, 47.791667, 48.041667, 41.541667, 40.875, 57.208333, 
64.375, 42.625, 43.958333, 69.958333, 72.375, 36.875, 66.958333, 
39.791667, 36.625, 52.625, 65.708333, 42.208333, 53.708333, 35.458333, 
58.625, 34.875, 57.291667, 59.708333, 61.708333, 72.041667, 59.958333, 
32.208333, 43.625, 39.541667, 62.625, 41.208333, 32.291667, 48.958333, 
47.291667, 60.375, 49.458333, 37.208333, 65.708333, 57.958333, 
31.041667, 63.875, 43.625, 54.541667, 55.541667, 45.458333, 72.375, 
54.708333, 37.958333, 32.375, 60.125, 59.041667, 37.875, 42.958333, 
44.375, 59.791667, 49.208333, 34.375, 53.208333, 59.458333, 53.375, 
45.458333, 72.125, 66.208333, 60.958333, 47.625, 60.291667, 41.125, 
67.541667, 54.625, 55.541667, 37.541667, 44.291667, 44.458333, 
40.041667, 49.458333, 39.625, 73.375, 41.458333, 71.375, 31.041667, 
66.791667, 42.541667), lon = c(-6.125, -19.541667, -29.291667, 
-9.2083333, -11.541667, -6.625, -25.708333, -14.458333, -48.291667, 
-63.541667, -41.291667, -12.541667, -48.291667, -58.708333, 6.625, 
-2.7083333, -69.375, -19.291667, -27.208333, -36.625, -17.791667, 
-50.541667, -38.708333, 9.375, -56.208333, -44.958333, -59.041667, 
8.875, -21.125, -24.791667, -40.375, -26.208333, -31.875, -11.875, 
-60.958333, -39.125, -32.458333, -54.791667, -44.541667, -37.958333, 
-48.625, -10.541667, 3.5416667, -17.791667, -16.041667, -9.9583333, 
-32.708333, 0.875, -18.625, -54.208333, -63.125, -56.458333, 
-55.125, -22.708333, -40.958333, -56.208333, -33.625, -69.125, 
-58.125, -17.541667, -23.541667, -17.041667, -18.458333, -64.791667, 
-25.208333, -35.875, -44.791667, -11.291667, -58.291667, -46.208333, 
-41.208333, -5.0416667, -38.208333, -13.875, -55.291667, -17.291667, 
-48.625, -38.791667, -59.375, -19.291667, 5.5416667, -19.625, 
-41.375, -66.291667, -17.625, -14.208333, -39.291667, -48.875, 
-16.541667, -21.375, -46.375, 2.625, -60.291667, -40.375, 2.4583333, 
-16.458333, 4.875, -66.291667, -4.2916667, -36.458333), entity = structure(c(2L, 
2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 
2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 
1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L), .Label = c("Cc", "Li"), class = "factor"), watcon = structure(c(1L, 
2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 
2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 
1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 
2L, 2L, 2L), .Label = c("calm", "stormy"), class = "factor"), 
    step = structure(c(1L, 3L, 2L, 4L, 4L, 2L, 3L, 3L, 3L, 4L, 
    2L, 2L, 3L, 2L, 1L, 3L, 3L, 3L, 4L, 4L, 4L, 1L, 1L, 1L, 2L, 
    4L, 1L, 2L, 2L, 4L, 2L, 4L, 4L, 3L, 4L, 2L, 2L, 1L, 2L, 2L, 
    1L, 4L, 3L, 2L, 3L, 3L, 2L, 4L, 1L, 3L, 2L, 2L, 3L, 4L, 4L, 
    2L, 2L, 3L, 4L, 1L, 3L, 2L, 1L, 4L, 2L, 3L, 1L, 3L, 1L, 2L, 
    1L, 4L, 4L, 3L, 1L, 1L, 1L, 3L, 1L, 2L, 2L, 4L, 3L, 4L, 4L, 
    4L, 1L, 2L, 1L, 4L, 3L, 4L, 2L, 4L, 1L, 4L, 1L, 2L, 2L, 4L
    ), .Label = c("abundance", "enccomb", "adscomb", "infcomb"
    ), class = "factor")), row.names = c(NA, -100L), class = "data.frame")
我使用的代码是:

library(oceanmap)
library(sf)
library(ggmap)
library(rnaturalearth)
library(rnaturalearthdata)
library(rgeos)
library(tidyverse)

world <- ne_countries(scale = "medium", returnclass = "sf")

library(doParallel)
library(foreach)
cl <- makeCluster(5)
doParallel::registerDoParallel(cl)
entities <- unique(sample$entity)

foreach(i=1:length(entities), .packages = c("tidyverse", "dplyr")) %dopar% {
  ggplot (data=world) + geom_sf(color="white", fill="white") +  coord_sf(xlim = c(-34,-30), ylim = c(53,62) , expand = FALSE) + geom_point(subset(sample, sample$entity==entities[i]), mapping=aes(x = lon, y = lat, color = log10(value))) + facet_grid(watcon~step2) +
    ggtitle(entities[i])
  ggsave(filename = paste0(i,".png"))
}

stopCluster(cl)
库(海洋地图)
图书馆(sf)
图书馆(ggmap)
图书馆(rnaturalearth)
图书馆(RNATuralLearthData)
图书馆(rgeos)
图书馆(tidyverse)

您是否尝试过使用
future\u map()
软件包中的
future\u map()
?或者一般的其他并行包?有什么不同吗?抱歉@Kaye11,你的例子对我不起作用;facet_grid(watcon~step2)'看起来引起了问题(示例df中没有'step2')。问题很可能是foreach必须将整个数据集发送给每个工作人员(检查RAM使用情况)。您应该在循环外拆分数据集,并在子集上迭代。@Adam B:我试过snowfall,结果是一样的。@jpmam1对不起,步骤和步骤2是可以互换的。如果您将我的代码更改为facet_grid(watcon~step),应该可以使用
future_map()
软件包中的
future_map()
?或者一般的其他并行包?有什么不同吗?抱歉@Kaye11,你的例子对我不起作用;facet_grid(watcon~step2)'看起来引起了问题(示例df中没有'step2')。问题很可能是foreach必须将整个数据集发送给每个工作人员(检查RAM使用情况)。您应该在循环外拆分数据集,并在子集上迭代。@Adam B:我试过snowfall,结果是一样的。@jpmam1对不起,步骤和步骤2是可以互换的。如果您将我的代码更改为facet_grid(watcon~step),它应该可以工作