我需要为具有89,000个长度为500的向量的向量集构建 cosine matrix (即每个向量组合之间的余弦距离矩阵),从而得到最终的89,000x89,000矩阵 . 我目前的方法似乎非常低效,导致非常长的处理时间(例如,使用具有52,000个长度为500的向量的向量集需要~36小时来构建52,000x52,000矩阵) .

我目前的解决方案使用的是R版3.0.1(2013-05-16),在英特尔酷睿i7 4960X CPU @ 3.60GHz x 12平台上运行64位版本的ubuntu 13.10,内存为64GB . 尽管我使用的是64位系统,但仍然会遇到从R中的原生子函数抛回的向量长度错误(例如,错误:...太多索引(> 2 ^ 31-1)用于提取);似乎没有解决这个问题 . 因此,我当前的解决方案使用 bigmemory 包中的 big.matrix 对象 . 我也在利用 doParallel 软件包来利用我工作站上的所有12个处理器内核 .

这是我目前使用的代码:

setSize <- nrow(vectors_gw2014_FREQ_csMns) #i.e. =89,095

COSmatrix <- filebacked.big.matrix(
        #set dimensions and element value type
        setSize, setSize, init=0,
        type="double",
        backingpath = './COSmatrices',
        backingfile    = "cosMAT_gw2014_VARppmi.bak", 
        descriptorfile = "cosMAT_gw2014_VARppmi.dsc" 
        )

#initialize progress bar
pb <- txtProgressBar(min = 0, max = setSize, style = 3)
feErr <- foreach(i=1:setSize) %dopar%  {
    COSmatrix <- attach.big.matrix("./COSmatrices/cosMAT_gw2014_FREQ_csMns.dsc")
    setTxtProgressBar(pb, i)
    for (j in 1:setSize)
    {   
        if (j < i) 
        {
            COSmatrix[i,j] <- cosine(   as.vector(vectors_gw2014_FREQ_csMns[i,],mode="numeric"),
                                        as.vector(vectors_gw2014_FREQ_csMns[j,],mode="numeric") )

            COSmatrix[j,i] <- COSmatrix[i,j]

        }
        else break
    }#FOR j
}#FOREACH DOPAR i
close(pb)

我怀疑我的代码存在的主要问题 - 即 . 导致处理时间过长的问题是在主foreach循环的每次迭代中重新附加big.matrix对象的调用:

COSmatrix <- attach.big.matrix("./COSmatrices/cosMAT_gw2014_FREQ_csMns.dsc")

但是,这似乎是必要的,以便访问FOREACH中的big.matrix对象(即来自 doparallel 包的并行处理功能)循环;如果主循环中没有这行代码,则无法访问COSmatrix对象(请参阅Using big.matrix in foreach loops) .

我正在寻找任何和所有建议,以简化这个过程,并将处理时间从几天缩短到几小时 . 这意味着我愿意在R中使用其他方法(即使用bigmemory包的替代方法),或使用完全不同的工具集(即python或C代码) . 请记住,许多(大多数?)常用的R函数不适用于这种大小的矩阵;我已经探索了许多有希望的途径,只是遇到长矢量32/64位限制(即错误:...提取的索引太多(> 2 ^ 31-1);参见Max Length for a Vector in R) .

干杯!