當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R pvec 使用 Forking 並行化向量映射函數


R語言 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

調用向量每個部分的函數

...

向量之後傳遞給 FUN 的任何其他參數

mc.set.seed

請參閱mcparallel

mc.silent

如果設置為TRUE然後所有輸出都在‘標準輸出' 對於所有分叉的並行進程將被抑製('標準錯誤’不受影響)。

mc.cores

要使用的核心數量,即最多同時運行多少個子進程。必須至少為 1 個,並行運行時至少為 2 個。該選項是從環境變量初始化的MC_CORES如果設置。

mc.cleanup

請參閱 mclapply 中對此參數的說明。

細節

pvec 並行化 FUN(x, ...),其中 FUN 是一個返回與 x 長度相同的向量的函數。 FUN 也必須是純的(即沒有 side-effects),因為 side-effects 不是從並行進程中收集的。該向量被分成幾乎相同大小的子向量,FUN 在其上運行。盡管原則上可以使用不一定是映射的函數,但解釋為case-specific,因為理論上分割是任意的(在這種情況下會給出警告)。

pvecmclapply 之間的主要區別在於,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.

也可以看看

mcparallelmclapplyparLapplyclusterMap

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Parallelize a Vector Map Function using Forking。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。