Итак, похоже, вы боретесь с экстремальными накладными расходами.
Вместо того, чтобы распараллеливать отдельные предложения, просто разделите задачу на несколько значительных частей и позвольте apply
сделать все остальное. Я выбрал 10 фрагментов по 100 предложений в каждом, возможно, есть более быстрая комбинация, но эта работает намного быстрее (по крайней мере, для меня), чем то, что вы просили:
library(doParallel)
library(foreach)
# generate fake sentences
txt <- readLines(url('https://baconipsum.com/api/?type=all-meat&sentences=300&start-with-lorem=1&format=text'))
sentences <- strsplit(txt,'\\.\\s')[[1]]
sentences <- rep(sentences[sample(1:100,100)],10)
# pairwise combinations of sentences
cbn <- combn(1:length(sentences),2)
# simple timing
st <- Sys.time()
# Since you work on LINUX, you can use FORK
cl <- makeCluster(detectCores(),type = 'FORK')
registerDoParallel(cl)
res <- foreach(ii = seq(1,1000,100),.combine = 'c') %dopar% {
apply(cbn[,ii:(ii+99)],2,function(x) stringdist(sentences[x[1]],sentences[x[2]],method = "jw"))
}
stopCluster(cl)
Sys.time() - st
На моей виртуальной машине Ubuntu этот код выполняется примерно за 1,8 секунды.
Характеристики:
Ubuntu 64 bit
R version 3.4
8 CPU cores
32GB RAM Memory
ХТН
Редактировать:
Возможно, в этом случае хорошей альтернативой будет отказ от параллельной обработки.
Используя эту версию lapply
, я могу вычислить среднее значение для каждого предложения примерно за 17 секунд:
res <- do.call(rbind,lapply(1:1000,function(ii) c(ii,1-mean(stringdist(sentences[ii],sentences[-ii],method = "jw")))))
Это даст вам матрицу из двух столбцов с индексом для каждого предложения и 1-mean
всех расстояний до соответствующего предложения.
person
Val
schedule
19.06.2017
dopar
, а затем в функцииstringdist
, где вы указываете количество потоков... Я не думаю, что это хорошая практика - person Val   schedule 19.06.2017nthread
внутри функцииstringdist
. Я попытался запустить код с параметромnthread
, установленным по умолчанию, и параметромdopar
, и не получил никакого ускорения. - person WitchKingofAngmar   schedule 19.06.2017