2

Windows 7 コンピューターで R の wordnet パッケージを使用して並列処理を利用しようとしています。具体的には、名詞のリストの同義語を見つけようとしています。私がやろうとしていることを示すために以下のサンプルコードをいくつか作成しましたが、並列で正しく実行されていないようです。ワーカーを起動し、ワーカーの 1 つを計算していますが、他のワーカーは計算していません。以下に作成したリストは、長さが 4 で、各スロットに 4 つの単語があります。リストを使用可能なコアの数で分割し、リストのサブセットを各コアに送信しようとしています。次に、sapply 関数は (並列ループ内で) 4 つの単語の同義語を取得します。Snowfall でもこれを試してみましたが、辞書をエクスポートすることはできませんでした (sfExport では実行されなかったようです)。「.export」を使用していません ディクショナリが見つからないというエラーも発生していたため、 foreach ループ内で実行しましたが、並列ループ内に配置すると機能するようです。どんな助けでも大歓迎です。

library(wordnet)
library(foreach)
library(doSMP)
library(rJava)

NbrOfCores <- 2

workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers
set.seed(1)

setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
dict<-getDictInstance()

words <- list(c("cat", "dog", "bird"),c("mouse", "iguana", "fish"),c("car", "tree", "house"),c("shoe", "shirt", "hat"))

rows=length(words) #4
prow<-floor(rows/NbrOfCores) #2

nouns<-foreach(i=1:NbrOfCores, .combine = c, .packages ="wordnet","rJava") %dopar% {
setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
dict<-getDictInstance()    
foreach(j=(prow*(i-1)+1):(prow*i)) %do% sapply(words[[j]],synonyms,"NOUN")}
4

1 に答える 1

1

あなたの問題は、あなたのi変数を設定する方法にあると思いますforeach。これがループする必要があるのはwords、コアの数ではなく、オブジェクトです。このコードは機能します:

library(wordnet)
library(foreach)
# library(doSMP) # I don't think you want to use this package anymore.
library(rJava)
require(snow) # Add the snow packages
require(doSNOW) 

NbrOfCores <- 2
cl.tmp = makeCluster(rep('localhost',NbrOfCores), type='SOCK')
registerDoSNOW(cl.tmp)

words <- list(c("cat", "dog", "bird"),c("mouse", "iguana", "fish"),c("car", "tree", "house"),c("shoe", "shirt", "hat"))

foreach(words=iter(words), .packages='wordnet') %dopar% {
    setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
    initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
    dict<-getDictInstance() 
    sapply(words,synonyms,pos='NOUN')
}

doSMP私のバージョンの R ではパッケージが利用できないようですsnow

于 2012-04-02T14:33:48.173 に答える