Python 构建超大余弦矩阵
我需要为长度为500的89000个向量的向量集构建一个余弦矩阵(即每个向量组合之间的余弦距离矩阵),最终生成89000x89000个矩阵。我目前的方法似乎效率很低,导致处理时间很长(例如,使用长度为500的52000个向量的向量集构建52000x52000矩阵需要约36小时) 我目前的解决方案使用的是R版本3.0.1(2013-05-16),运行在64位版本的ubuntu 13.10上,运行在Intel Core i7 4960X CPU@3.60GHz x 12平台上,内存为64GB。尽管我使用了64位系统,但仍然会遇到从R中的本机子函数返回的向量长度错误(例如,错误:…用于提取的索引太多(>2^31-1));这个问题似乎没有解决办法。因此,我当前的解决方案使用bigmemory包中的big.matrix对象。我还使用了doParallel软件包来利用工作站上的所有12个处理器内核 这是我当前使用的代码:Python 构建超大余弦矩阵,python,c++,r,bigdata,trigonometry,Python,C++,R,Bigdata,Trigonometry,我需要为长度为500的89000个向量的向量集构建一个余弦矩阵(即每个向量组合之间的余弦距离矩阵),最终生成89000x89000个矩阵。我目前的方法似乎效率很低,导致处理时间很长(例如,使用长度为500的52000个向量的向量集构建52000x52000矩阵需要约36小时) 我目前的解决方案使用的是R版本3.0.1(2013-05-16),运行在64位版本的ubuntu 13.10上,运行在Intel Core i7 4960X CPU@3.60GHz x 12平台上,内存为64GB。尽管我使
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)
setSize首先,我建议去掉“if”语句,将“for(j in 1:setSize)”替换为“for”(j in 1:I)”,但老实说,这仍然不是一个非常重要的优化……我认为该矩阵不适合内存空间。。。。更不用说允许使用12个处理器进行并行处理,每个处理器都需要空间。只是想知道,程序是否受到CPU的限制?看起来这样大小的矩阵很容易耗尽内存。有可能对算法进行分区吗?谢谢@Tomasz Posłuszny,每一点都有帮助。@BondedDust,如果你仔细看代码(我应该提到这一点),我正在使用一个备份文件(在250GB固态硬盘上)的大矩阵对象来解决这个问题;使用文件备份可以避免内存限制,但会以性能为代价。
COSmatrix <- attach.big.matrix("./COSmatrices/cosMAT_gw2014_FREQ_csMns.dsc")