Как создать потокобезопасную оболочку Rcpp :: CharacterMatrix с RcppParallel?

У меня есть задача, где мне нужно обработать большую матрицу (миллионы строк, сотни столбцов) строк символов. Каждая операция строки независима. Поэтому я хотел бы использовать некоторые параллельные вычисления для увеличения скорости всего проекта.

Если я построю myWorker для числовых матриц, следующим образом, я могу скомпилировать код без ошибок

// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
#include <Rcpp.h>
#include <string.h>

struct myWorker : public RcppParallel::Worker
{
// input
const RcppParallel::RMatrix<double> input;
int version;

// output
RcppParallel::RMatrix<double> outmat;

// initialization
myWorker(const Rcpp::NumericMatrix input, int version, Rcpp::NumericMatrix outmat)
: input(input), version(version), outmat(outmat) {}

// the operator
void operator()(std::size_t begin, std::size_t end) {
// do stuff
}
};

Тем не менее, когда я устанавливаю входную матрицу и инициализацию для использования
Rcpp::CharacterMatrix Я получаю ошибки компиляции.

In instantiation of ‘RcppParallel::RMatrix<T>::RMatrix(const Source&) [with
Source = Rcpp::Matrix<16>; T = <typehere>]

R/x86_64-pc-linux-gnu-library/3.3/RcppParallel/include/RcppParallel/RMatrix.h:198:28:
error: cannot convert ‘Rcpp::Matrix<16>::iterator {aka
Rcpp::internal::Proxy_Iterator<Rcpp::internal::string_proxy<16> >}’ to
‘std::basic_string<char>*’ in initialization
ncol_(source.ncol())

Комбинации, которые я пробовал с myWorker(const Rcpp::NumericMatrix input

const RcppParallel::RMatrix<std::string> input;
const RcppParallel::RMatrix<char> input;
const RcppParallel::RMatrix<char*> input;
const RcppParallel::RMatrix<char**> input;
const RcppParallel::RMatrix<char32_t> input;

Указатели были плохой идеей. Другие варианты приводят к общей отмеченной ошибке
выше.

Был задан очень похожий вопрос
Вот.

Есть ли простой способ обернуть Rcpp::NumericMatrix с
RcppParallel::RMatrix для поточно-ориентированной работы с символьной матрицей?

РЕДАКТИРОВАТЬ

Подробнее о задании:

imput матрица состоит из кодов ICD-9-CM или ICD-10-CM, которые необходимо
по сравнению с наборами кодов для определения классификаций. Есть миллионы
строки, сотни столбцов и около десятка классификаций.

Небольшой пример в чистом R будет:

classification_1 <-
c("99680", "99688", "99689", "V421", "V422", "V426", "V5391", "4697", "5051",
"5059", "5280", "5282", "4103", "0091", "0092", "0093")
classification_2 <-
c("14", "15", "16", "17", "18", "19", "20", "23", "V4281", "V4282", "0010", "9925")

icd_codes <-
structure(c("5282", "3320", "4100", "0234", "V426", "3895", "3592",
"5651", "0397", "V5302", "5675", "0092", "V461", "4697", "5571",
"3776", "9964", "9702", "3583", "8607", "99661", "3767", "3129",
"3182", "5503", "5285", "4641", "6861", "3351", "2751", "76511",
"V446", "34581", "7472", "5190", "9723", "28801", "0010", "8103",
"4270", "9962", "4211", "4242", "34511", "3352", "0372", "76492",
"5675", "284", "4281", "3314", "0681", "3781", "0152", "3760",
"3763", "5597", "4399", "V5351", "8108", "3994", "4581", "V460",
"5533", "8137", "99663", "4210", "741", "5722", "8949", "76412",
"5569", "5674", "99667", "7707", "3753", "8606", "V553", "5051",
"2884", "5059", "7711", "8136", "5673", "7373", "2821", "5993",
"3776", "2822", "4274", "3789", "0371", "3591", "76523", "5722",
"V56", "V445", "2359", "4243", "99683"), .Dim = c(5L, 20L))

apply(icd_codes, 1,
function(x) {
c(class1 = as.integer(any(x %in% classification_1)),
class2 = as.integer(any(x %in% classification_2)))
})

Каждый ряд icd_codes объект может быть оценен параллельно. Так как у меня есть
работает однопоточная версия C ++ выше работы, я надеялся использовать
RcppParallel, чтобы улучшить общую скорость работы, и, что очень важно, сделать это в
Это как можно ближе к ОС, насколько это возможно. Группа, с которой я работаю
состоит из пользователей Windows, OSX и Linux.

1

Решение

Чрезвычайно быстрое решение матричной алгебры на основе Rcpp для задачи классификации сопутствующих заболеваний см. В моем пакете. ИКД, в частности, статья в формате PDF, отправленная в JSS на методология.

Это никогда не будет быстрым с обработкой строк, как вы быстро узнаете при профилировании, независимо от того, сколько вы проводите высокоуровневую оптимизацию.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]