2012-03-26 8 views
2

Ich versuche, die parallele Verarbeitung mit dem Wordnet-Paket für R auf einem Windows 7-Computer zu verwenden. Insbesondere versuche ich, die Synonyme für eine Liste von Substantiven zu finden. Ich habe unten einen Beispielcode gemacht, um zu zeigen, was ich versuche, aber es scheint nicht korrekt parallel ausgeführt zu werden. Es beginnt die Arbeiter, und es berechnet sich auf einen der Arbeiter, aber nicht die anderen. Die Liste, die ich unten gemacht habe, hat eine Länge von 4 mit 4 Wörtern in jedem Schlitz. Ich versuche, die Liste nach der Anzahl der verfügbaren Kerne aufzuteilen und eine Teilmenge der Liste an jeden Kern zu senden. Dann erhält die Sapply-Funktion die Synonyme für die 4 Wörter (innerhalb der Parallelschleife). Ich habe es auch mit Snowfall versucht, aber ich konnte das Wörterbuch nicht exportieren (sfExport schien es nicht zu tun). Ich verwende nicht den ".export" innerhalb der foreach-Schleife, weil es auch Fehler gab, wenn das Wörterbuch nicht lokalisiert wurde, aber es in die parallele Schleife zu bringen, scheint es zu funktionieren. Jede Hilfe würde sehr geschätzt werden.Parallele Verwendung von Wordnet in r (mit Windows 7)

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")} 

Antwort

1

Ich denke, Ihr Problem, wie Sie Setup ist die i Variable in Ihrem foreach. Was das durchschleifen sollte, ist das words Objekt, nicht die Anzahl der Kerne. Dieser Code funktioniert:

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') 
} 

Es ist wie die doSMP Pakete sieht für meine Version von R nicht verfügbar ist, so wechselte ich es nur snow, aber man konnte verwenden, was Backend Sie wollen.

+0

Danke, für den Code. Ich habe gestern ausgearbeitet, mein Hauptproblem war, dass ich meine Umgebungsvariablen nicht richtig definiert habe. Ich musste WNHOME für Benutzer und System definieren. Ich hatte bereits WNSEARCHDIR, aber ohne WNHOME schien es das Wörterbuch nicht zu finden. Ich mag deinen Code aber besser, ich war in letzter Zeit genervt von doSMP, es ist ziemlich unberechenbar in Bezug auf das Starten und Beenden des Clusters, also denke ich, dass ich zu Schnee (oder Schneefall) wechseln werde. Danke nochmal! –