Python 是否仍要修复此代码段以避免内存瓶颈?
下面的这个片段是从Python 是否仍要修复此代码段以避免内存瓶颈?,python,numpy,memory-management,out-of-memory,Python,Numpy,Memory Management,Out Of Memory,下面的这个片段是从/utils/utils.py中获得的 我遇到的问题是,这个get_precisionK函数调用getSimilarity函数,该函数计算NxM矩阵及其转置的乘积。该产品是对称的,并且是NxN,因此我们可以将内存使用量减少近一半。但是这里更大的问题是N的数量级是10**5。在我正在处理的特定问题中,N大约是600k 一个600k x 600k的双精度矩阵需要3TB的内存,这是我没有的。因此,当试图计算np.dot时,代码正在崩溃(因为内存限制)。我试图在不超过内存限制的情况下重
/utils/utils.py
中获得的
我遇到的问题是,这个get_precisionK
函数调用getSimilarity
函数,该函数计算NxM矩阵及其转置的乘积。该产品是对称的,并且是NxN,因此我们可以将内存使用量减少近一半。但是这里更大的问题是N的数量级是10**5
。在我正在处理的特定问题中,N大约是600k
一个600k x 600k的双精度矩阵需要3TB的内存,这是我没有的。因此,当试图计算np.dot
时,代码正在崩溃(因为内存限制)。我试图在不超过内存限制的情况下重新构造代码。但是功能使用产品的方式让它有点困难
我唯一能想到的就是将嵌入
矩阵行的子集输入到getSimilarity
函数中,计算乘积,然后对其排序并将其写入文件(编辑:实际上,我不需要排序和写入文件,我想我只需要将值写入文件,然后再对其进行排序)。因此,我们最终会有多个具有排序索引的文件,我们必须以某种方式将所有文件同步到一个巨大的文件中。我认为同步部分是另一个挑战
for
按降序循环。然后我需要读取前面提到的大文件的连续小部分(无论内存允许什么),并执行操作
这听起来很复杂,我想看看是否还有其他人有更好的想法
def getSimilarity(result):
print "getting similarity..."
return np.dot(result, result.T)
****Note that embedding is NxM mumpy array where N is very large, ~ O(10^5) ****
def check_reconstruction(embedding, graph_data, check_index):
def get_precisionK(embedding, data, max_index):
print "get precisionK..."
similarity = getSimilarity(embedding).reshape(-1)
sortedInd = np.argsort(similarity)
cur = 0
count = 0
precisionK = []
sortedInd = sortedInd[::-1]
for ind in sortedInd:
x = ind / data.N
y = ind % data.N
count += 1
if (data.adj_matrix[x].toarray()[0][y] == 1 or x == y):
cur += 1
precisionK.append(1.0 * cur / count)
if count > max_index:
break
return precisionK
precisionK = get_precisionK(embedding, graph_data, np.max(check_index))
ret = []
for index in check_index:
print "precisonK[%d] %.2f" % (index, precisionK[index - 1])
ret.append(precisionK[index - 1])
return ret