parallel brug af wordnet i r (med windows 7)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at gøre brug af parallelbehandling med Wordnet-pakken til R på en Windows 7-computer. Specielt forsøger jeg at finde synonymerne for en liste over navneord. Jeg har lavet nogle eksempler nedenfor for at vise, hvad jeg forsøger at gøre, men det synes ikke at udføres korrekt parallelt. Det starter arbejderne, og det regner med en af ​​arbejderne, men ikke de others.The liste jeg har lavet nedenfor har en længde på 4 med 4 ord i hver slot. Jeg forsøger at dele listen med antallet af tilgængelige kerner og sende en delmængde af listen til hver kerne. Derefter får sapply-funktionen synonymerne til de 4 ord (inden for parallel loop). Jeg har også forsøgt at gøre dette med snefald, men jeg kunne ikke få det til at eksportere ordbogen (sfExport syntes ikke at gøre det). Jeg bruger ikke '.export' i foreach-loopen, fordi det også gav fejl, da ordbogen ikke var placeret, men at sætte den inden for parallellsløjfen synes at gøre det til at fungere. Enhver hjælp ville blive meget værdsat.


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

Bedste reference


Jeg tror, ​​at dit problem er, hvordan du konfigurerer variablen i i din foreach. Hvad dette skal løbe igennem er words objektet, ikke antallet af kerner. Denne kode fungerer:


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


Det ser ud til, at pakkerne doSMP ikke er tilgængelige for min version af R, så jeg skiftede det bare til snow, men du kunne bruge den ønskede backend.