Этот фрагмент ниже был получен из 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