构建非常大的余弦矩阵

时间:2014-08-15 23:32:27

标签: python c++ r bigdata cosine

我需要为具有89,000个长度为500的向量的向量集构建余弦矩阵(即每个向量组合之间的余弦距离矩阵),从而得到最终的89,000x89,000矩阵。我目前的方法效率似乎非常低,导致处理时间非常长(例如,使用长度为500的52,000个向量的向量集需要大约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)用于提取< / em>的);似乎没有解决这个问题。因此,我当前的解决方案使用 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)用于提取;请参阅{ {3}})。

干杯!

0 个答案:

没有答案