- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 C/C++ 代码在 R 中开发一个数据处理模块,主要是出于速度原因。这是我的问题的事实列表。
wrap
花费了大量时间转换 vector<vector<string> >
至 List
用于我的数据。因此我打算直接在 SEXP 结构中工作,这样我可能会节省最终转换的时间。我的主要功能如下所示。
boost::atomic<bool> done(false);
SEXP myfun(...) {
...
SEXP sdataStr;
PROTECT(sdataStr=allocVector(VECSXP, nElem));
vector<SEXP> dataStr(nElem);
for (int i=0; i<nElem; ++i) {
dataStr[i]=SET_VECTOR_ELT(sdataStr, i, allocVector(STRSXP, n));
}
Producer producer(&queue);
Consumer consumer1(dataStr, nElem, &queue);
Consumer consumer2(dataStr, nElem, &queue);
boost::thread produce(producer);
boost::thread consume1(consumer1);
boost::thread consume2(consumer2);
produce.join();
done=true;
consume1.join();
consume2.join();
UNPROTECT(1);
return sdataStr;
}
我的消费者类是这样的
class Consumer {
vector<SEXP>& m_dataStr;
boost::lockfree::queue<buffer>* m_queue;
buffer m_buffer;
public:
Consumer(vector<SEXP>& dataStr, boost::lockfree::queue<buffer>* queue) : m_dataStr(dataStr), m_queue(queue) {}
void operator()() {
while (!done) {
while (m_queue->pop(m_buffer)) {
process_item();
}
}
while (m_queue->pop(m_buffer)) {
process_item();
}
}
private:
process_item() {
...
// for some 0<=idx<nElem, 0<=i<n, some char* f and integer len
SET_STRING_ELT(m_dataStr[idx], i, mkCharLen(f,len));
...
}
}
这些是我唯一使用 Rinternals 的地方。该程序的逻辑确保不会发生不同线程写入同一位置的情况,即 idx
。和 i
组合 Consumer
类最多可以出现一次。我遇到了各种奇怪的问题,比如“stack imbalance”,或者“snaping into wrong generation”等等。有什么我想念的吗?或者不建议在多线程中调用 SET_STRING_ELT?非常感谢!
最佳答案
除非您知道自己在做什么,否则不应在线程中调用 C/R API 函数,例如 mkCharLen
可能会修改用于所有 R 字符串的内部哈希表,因此您可以不要在线程中调用它。 SET_STRING_ELT
也可能在线程中不可用,尤其是在写屏障打开的情况下。
关于c++ - R并行写入SEXP结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28774804/
我有很棒的vim-sexp和 vim-sexp-mappings-for-regular-people安装了插件,我遇到了一个我不确定如何解决的情况。 假设我有以下形式: (alimony barba
在任何 lisp 中是否有一种形式可以“传播”父 sexp 中的列表?喜欢: (+ (spread '(1 2 3))) -> (+ 1 2 3) 最佳答案 有两种方法可以做到这一点。哪个更好取决于你
如果我写一个文件使用 (with-open-file (s "~/example.sexp" :direction :output) (write '(1 2 3) :strea
我正在尝试创建一个捕获模板,该模板将 URL 转换为带有 的组织模式链接。作为链接名称。 我的转换函数如下所示: (defun get-page-title (url) "Get title o
sexp 是这样的:type sexp = Atom of string | sexp 列表列表,例如,"((a b) ((c d) e) f)"。 我编写了一个解析器来将 sexp 字符串解析为以下
我正在使用 C 中的 R 内部接口(interface)。我需要从 C 中分析 SEXP 的内容,但我不知道确切的 SEXP 结构。有没有一种简单的方法(或一些现有代码)可以将 SEXP 转储到控制台
我正在写一个 R package to provide debug helper functions gdb 打印 R 的 SEXP 和 Rcpp 数据类型的变量值。 C/C++ 是一种强类型语言,但
我有一个函数可以替换列表中符号的所有实例: (defun replace-symbol-in-sexp-fn (symbol-to-replace new-symbol sexp) (if (eq
对于一项任务,我们必须实现类似非常基本的 sexp 解析器的东西,这样的输入如下: "((a b) ((c d) e) f)" 它会返回: [["a", "b"], [["c", "d"], "e"]
这个问题在这里已经有了答案: Initialize a variable with different type based on a switch statement (2 个答案) 关闭 6 年
如何使用 org-contacts 设置纪念日,以便在我的议程.org 文件中显示生日等内容? 我的议程.org 文件包含以下内容,如 org-contacts 底部所述 #+STARTUP: sho
我需要将已知长度的 const char* 转换为 Rcpp::RawVector 以返回到 R. Rcpp::wrap 适用于许多类型,但似乎不适用于 char *。 最佳答案 library(Rc
愚蠢的人,但我自己想不出来 - 我如何获得下一个 sexp?就像 preceding-sexp 一样,但是向前。 最佳答案 查看 forward-sexp。你有一个很好的例子here . 好的,根据您
我在 utop 中运行这段代码: # type u = { a: int; b: float } [@@deriving sexp];; 但是没有生成预期的 s 表达式转换器声明。 我安装了 Core
我在 Hadley Wickham 的书中读到 RObjects 应该在 R 的 C API 中声明为 S 表达式 (SEXP): SEXP x( SEXP a, SEXP b { } 然而,在 Rc
假设我有一个函数将 SEXP 类型作为参数: SEXP myFun(SEXP param) 如何找出这个参数的类型?查看我的调试器中的 SEXP 类型,我可以看到我可以调用 param->sxpinf
考虑一个虚拟的例子 > cppFunction(' + NumericVector invert(NumericVector& x) { + x = x + 1; + return x
SEXP callFunction1(List network, List words, Function testWordContinuity){ SEXP res = testWordCont
有没有办法转换 arma::subview进入 SEXP ?创建矩阵后我有以下代码 X在我的 Rcpp代码: //.... MCMC loop if(i % skiplength == 0)
正在关注 this recipe ,我准备了这个搜索命令: (shell-command "grep . /tmp/listoffiles | xargs grep -n mystring" 1) 如
我是一名优秀的程序员,十分优秀!