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