Перемешать большую скудную разреженную матрицу - PullRequest
0 голосов
/ 02 марта 2019

У меня проблемы с большой матрицей.История такова:

  • У меня большая матрица (строка 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. Поэтому он намного медленнее, чем последовательное чтение.

Мой вопрос: есть ли способ улучшить это?либо

  • время от времени перемешивать входную матрицу (порядок строк на самом деле не имеет значения, поэтому его можно перемешать на месте), чтобы мы могли читать элемент последовательно позже, или

  • есть ли более быстрый способ произвольного доступа к строке большой матрицы?

Спасибо за чтение моего поста.

Лучшее,

...