У меня проблемы с большой матрицей.История такова:
- У меня большая матрица (строка x col до 20 миллионов x 20 миллионов).
- Поскольку матрица имеет разреженные строки, я использую scipy sparseМатрица csr для хранения матрицы.
- В моем основном алгоритме есть часть, которая мне нужна для случайной выборки набора строк из этой матрицы (скажем, 1000 строк).
Если число столбцов слишком велико, я не могу извлечь все строки сразу, как
# get a random batch of size b
index = random.sample(range(n), b)
X_batch = X[index]
Мое текущее решение - извлечь по партиии сделайте расчет на основе этого:
# get a random batch of size b
index = random.sample(range(n), b)
# calculate number of batches
total_mem_batch = 1e9 # a large number represent the total available memory
batch_size = int(total_mem_batch // nnzX) # nnz is average number of nonzero per row
num_batches = math.ceil(b / batch_size)
result = np.zeros(d)
for j in range(num_batches):
# calculate start/end indices for each batch
startIdx = batch_size*j
endIdx = np.minimum(batch_size*(j+1), b)
batch_X = X[index[startIdx:endIdx],:]
batch_Y = Y[index[startIdx:endIdx]]
batch_bias = bias[index[startIdx:endIdx]]
# do main operation
result += ...
Теперь горлышко бутылки находится в поиске набора строк матрицы.Поскольку индексный массив перемешан, его можно рассматривать как случайный доступ к строке входной матрицы X. Поэтому он намного медленнее, чем последовательное чтение.
Мой вопрос: есть ли способ улучшить это?либо
время от времени перемешивать входную матрицу (порядок строк на самом деле не имеет значения, поэтому его можно перемешать на месте), чтобы мы могли читать элемент последовательно позже, или
есть ли более быстрый способ произвольного доступа к строке большой матрицы?
Спасибо за чтение моего поста.
Лучшее,