В любом случае, чтобы спасти этот фрагмент кода, чтобы избежать узких мест в памяти? - PullRequest
1 голос
/ 09 апреля 2019

Этот фрагмент ниже был получен из https://github.com/suanrong/SDNE в /utils/utils.py.

У меня проблема в том, что эта функция get_precisionK вызывает функцию getSimilarity, которая вычисляет произведение NxMматрица и ее транспонирование.Продукт является симметричным и имеет размер NxN, поэтому мы можем уменьшить использование памяти почти вдвое.Но большая проблема здесь - это N * порядка 1008 *.В конкретной проблеме, с которой я работаю, N составляет около 600k.

Матрица двойников 600 x 600 000 требует около 3 ТБ памяти, чего у меня нет.Так что код падает (из-за ограничений памяти) при попытке вычислить np.dot.Я пытаюсь реструктурировать код, не превышая ограничения памяти.Но то, как функция использует продукт, делает его немного сложным.

Единственное, что я мог придумать, это подать в подмножество строк матрицы embedding функцию 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
...