从R

时间:2017-12-09 22:02:50

标签: r multithreading parallel-processing queue shared-memory

问题描述:

我正在尝试在R中建立一个连接到Oanda REST API的自动交易系统。我的操作系统是Windows 10。 该程序有两个独立的无限循环组件,通过" while(TRUE)":"交易引擎"和#t; tick数据流引擎"。 程序的组织方式使得两个组件通过使用" R6"创建的队列对象进行通信。包。 " tick数据流引擎"从Oanda服务器接收tick FX数据。 然后它从数据中创建一个tick事件对象" push"使用" R6"创建的队列类实例将tick事件发送到队列包。 "交易引擎" "弹出"队列对象并分析出来的事件对象。 如果它是Tick数据事件,则进行分析以查看它是否满足交易策略逻辑设置的条件。 如果弹出的tick事件满足条件,则交易引擎创建订单事件对象 这是"推"使用" R6"创建的队列类的相同实例到队列的后面封装

为此,我想运行"交易引擎"使用一个线程并运行" tick数据流引擎"使用另一个线程。 两个独立的线程应该能够推送到同一事件队列实例并从中弹出。 我的理解是事件队列实例对象应该是两个独立线程可以访问它的共享对象。

问题:

我的问题是如何实现一个共享对象,该对象可以通过在两个独立线程上运行的代码文件进行动态修改(写入/读取) 或任何其他可以帮助从两个或多个线程实现对同一对象的读/写的构造? 我怎么可能使用其他包,如" mmap"对于共享内存实现或任何其他包来实现我的目标?

尝试:

为了测试该程序的可行性,这是我尝试的: 为了简单和可重复,我创建了一个名为" sharedMatrix"的共享对象。 它是一个10 x 1矩阵,它将在我的实际Oanda API程序中扮演事件队列实例的角色。 我使用了" bigmemory" R包转换初始矩阵" m"成为一个big.matrix对象" x"并附加它以便它可以是共享对象:" sharedMatrix"。 通过这样做,我期待" sharedMatrix"被看见"并由运行两个单独代码文件的每个线程修改。

#Codefile1   
for(i in 1:5){
  sharedMatrix[i,1] <- i
}

#Codefile2   
for(j in 6:10){
  sharedMatrix[j,1] <- j
}

我使用&#34; foreach&#34;来源这两个代码文件。和&#34; doParallel&#34; R包通过执行以下代码:

library(doParallel)
library(bigmemory)
library(foreach)

m <- matrix(nrow = 10) # Create 10 x 1 matrix

x <-as.big.matrix(m) #convert m to bigmatrix

mdesc <- describe(x) # get a description of the matrix

cl <- makeCluster(2,outfile = "Log.txt") # Create a cluster of two threads 
#with output file "Log.txt" 
registerDoParallel(cl)
clusterExport(cl=cl,varlist=ls()) #export input data to all cores

fileList  <-list("Codefile1.R","Codefile2.R") # a list of script files saved 
#in current working directory
foreach(f=fileList, .packages = "bigmemory") %dopar% {

sharedMatrix <- attach.big.matrix(mdesc) # attach the matrix via shared 
#memory
source(f)  # Source the script files for parallel execution
}

令我惊讶的是,这是执行上述代码时的控制台输出:

Error in { : task 1 failed - "object 'sharedMatrix' not found"

在检查了sharedMatrix的内容之后,我希望看到类似这样的内容:

sharedMatrix[] 
1 2 3 4 5 6 7 8 9 10

然而,这就是我所看到的:

sharedMatrix[]
Error: object 'sharedMatrix' not found

在我看来,工作线程并没有&#34;看到&#34;共享对象&#34; sharedMatrix&#34;。 任何帮助将非常感谢。感谢。

1 个答案:

答案 0 :(得分:1)

使用

library(doParallel)
library(bigmemory)
library(foreach)

m <- matrix(nrow = 10) # Create 10 x 1 matrix

x <-as.big.matrix(m) #convert m to bigmatrix

mdesc <- describe(x) # get a description of the matrix

cl <- makeCluster(2,outfile = "Log.txt") # Create a cluster of two threads 
#with output file "Log.txt" 
registerDoParallel(cl)
clusterExport(cl=cl,varlist=ls()) #export input data to all cores

fileList  <-list("Codefile1.R","Codefile2.R") # a list of script files saved 
#in current working directory
foreach(f=fileList, .packages = "bigmemory") %dopar% {

  sharedMatrix <- attach.big.matrix(mdesc) # attach the matrix via shared 
  #memory
  source(f, local = TRUE)  # Source the script files for parallel execution
  NULL
}
parallel::stopCluster(cl)

基本上,您需要local = TRUE功能中的source()选项。

PS:另外,请务必停止群集。