pvec
位於 parallel
包(package)。 說明
pvec
通過分割向量並將每個部分提交給一個核心,在向量元素上並行執行函數。該函數必須是矢量化映射,即它接受矢量輸入並創建與輸入完全相同長度的矢量輸出,該輸出不依賴於矢量的劃分。
它依賴於分叉,因此在 Windows 上不可用,除非 mc.cores = 1
。
用法
pvec(v, FUN, ..., mc.set.seed = TRUE, mc.silent = FALSE,
mc.cores = getOption("mc.cores", 2L), mc.cleanup = TRUE)
參數
v |
要操作的向量 |
FUN |
調用向量每個部分的函數 |
... |
向量之後傳遞給 |
mc.set.seed |
請參閱 |
mc.silent |
如果設置為 |
mc.cores |
要使用的核心數量,即最多同時運行多少個子進程。必須至少為 1 個,並行運行時至少為 2 個。該選項是從環境變量初始化的MC_CORES如果設置。 |
mc.cleanup |
請參閱 |
細節
pvec
並行化 FUN(x, ...)
,其中 FUN
是一個返回與 x
長度相同的向量的函數。 FUN
也必須是純的(即沒有 side-effects),因為 side-effects 不是從並行進程中收集的。該向量被分成幾乎相同大小的子向量,FUN
在其上運行。盡管原則上可以使用不一定是映射的函數,但解釋為case-specific,因為理論上分割是任意的(在這種情況下會給出警告)。
pvec
和 mclapply
之間的主要區別在於,mclapply
將分別在每個元素上運行 FUN
,而 pvec
假定 c(FUN(x[1]), FUN(x[2]))
等效於 FUN(x[1:2])
,因此將分為對 FUN
,因為有多個核心(或元素,如果較少),每個核心處理一個子集向量。這使得它比 mclapply
更高效,但需要對 FUN
進行上述假設。
如果mc.cores == 1
,則在當前進程中評估FUN(v, ...)
。
值
計算結果 - 在成功的情況下,它應該與 v
具有相同的長度。如果發生錯誤或函數不是映射,則結果可能會更短或更長,並發出警告。
注意
由於並行化的性質,錯誤處理不遵循通常的規則,因為錯誤將以字符串形式返回,而被殺死的子進程的結果將簡單地顯示為不存在的數據。因此,用戶有責任檢查結果的長度以確保其大小正確。如果是這種情況,pvec
會發出警告,因為它不知道這樣的結果是否是有意的。
請參閱mcfork
,了解不建議將其與 GUI front-ends 和多線程庫一起使用。
例子
x <- pvec(1:1000, sqrt)
stopifnot(all(x == sqrt(1:1000)))
# One use is to convert date strings to unix time in large datasets
# as that is a relatively slow operation.
# So let's get some random dates first
# (A small test only with 2 cores: set options("mc.cores")
# and increase N for a larger-scale test.)
N <- 1e5
dates <- sprintf('%04d-%02d-%02d', as.integer(2000+rnorm(N)),
as.integer(runif(N, 1, 12)), as.integer(runif(N, 1, 28)))
system.time(a <- as.POSIXct(dates))
# But specifying the format is faster
system.time(a <- as.POSIXct(dates, format = "%Y-%m-%d"))
# pvec ought to be faster, but system overhead can be high
system.time(b <- pvec(dates, as.POSIXct, format = "%Y-%m-%d"))
stopifnot(all(a == b))
# using mclapply for this would much slower because each value
# will require a separate call to as.POSIXct()
# as lapply(dates, as.POSIXct) does
system.time(c <- unlist(mclapply(dates, as.POSIXct, format = "%Y-%m-%d")))
stopifnot(all(a == c))
作者
Simon Urbanek and R Core.
Derived from the multicore
package formerly on CRAN.
也可以看看
相關用法
- R children 用於管理分叉進程的低級函數
- R makeCluster 創建並行套接字集群
- R clusterApply 使用集群應用操作
- R RNGstreams Pierre L'Ecuyer 的 RngStreams 的實施
- R detectCores 檢測CPU核心數
- R mcparallel 在單獨的進程中異步計算 R 表達式
- R mcfork 分叉當前 R 進程的副本
- R mcaffinity 獲取或設置當前進程的CPU親和性掩碼
- R mclapply 使用 Forking 的 lapply 和 mapply 並行版本
- R splitIndices 劃分任務在集群中分布
- R SparkR partitionBy用法及代碼示例
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr list_transpose 轉置列表
- R purrr as_vector 將列表強製轉換為向量
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr map_depth 在給定深度映射/修改元素
- R SparkR printSchema用法及代碼示例
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr rerun 多次重新運行表達式
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Parallelize a Vector Map Function using Forking。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。