首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用RcppParallel创建Rcpp::CharacterMatrix的线程安全包装?

如何使用RcppParallel创建Rcpp::CharacterMatrix的线程安全包装?
EN

Stack Overflow用户
提问于 2017-04-15 16:53:57
回答 1查看 271关注 0票数 1

我有一个任务,我需要处理一个大型矩阵(数百万行,数百列)的字符串。每一行操作都是独立的。因此,我想利用一些并行计算来提高整个项目的速度。

如果我为数字矩阵构建myWorker,如下所示,我就能够编译代码而不会出现错误

代码语言:javascript
复制
// [[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时,我得到了编译错误。

代码语言:javascript
复制
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尝试过的组合

代码语言:javascript
复制
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;

这些指针不是一个好主意。其他选项会导致上面提到的常见错误。

一个非常类似的问题被问到了here

有没有一种简单的方法可以用RcppParallel::RMatrix包装一个Rcpp::NumericMatrix,以便使用字符矩阵进行线程安全的工作?

编辑

有关该任务的更多详细信息:

imput矩阵由ICD-9-CM或ICD-10-CM代码组成,需要将它们与一组代码进行比较以确定分类。有数百万行、数百列和大约12个分类。

纯R中的一个小示例是:

代码语言:javascript
复制
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用户组成。

EN

回答 1

Stack Overflow用户

发布于 2018-12-17 05:38:55

有关共病分类问题的基于Rcpp的矩阵代数的极快解决方案,请参阅我的包icd,特别是在methodology上发送给JSS的PDF文章。

字符串处理永远不会很快,因为您在分析时很快就会发现,无论您做了多少更高级别的优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43424114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档