Самый быстрый способ создать массив numpy.memmap и затем заполнить его - PullRequest
0 голосов
/ 19 декабря 2018

Я создал массив 127,545 x 1,234,620 с помощью np.memmap (я называю это характеристической матрицей).Если моя математика верна (127 545 1 234 620 4/8/1 000 000 000), мой массив должен составлять 78,73 ГБ при 4 битах на ячейку.Однако, если посмотреть на его свойства, он составляет 586 ГБ.Я определенно что-то здесь упускаю.Тем не менее, я просто рад, что это сработало, и теперь оно было создано.Создание заняло около 2 часов.

В любом случае мне нужно заполнить его сейчас, и я смертельно боюсь, сколько времени потребуется, чтобы сделать это.По сути, у меня есть уникальное целое число, которое представляет каждую из строк (таким образом, 127 545 целых чисел хранятся в множестве ()) и набор целых чисел, представляющих каждый столбец (таким образом, 1 234 620 наборов целых чисел хранятся в словаре).Если целое число строки находится в наборе целых чисел столбца, то ячейка строки / столбца получает 1, в противном случае 0.

Хотелось бы получить несколько советов о том, как сделать это максимально эффективно.

Код для создания массива:

import numpy as np
nrows, ncols = 127545, 1234620
char_array = np.memmap(r"H:\Python\chararray.dat", dtype=np.float32, mode='w+', shape=(nrows, ncols))      

Текущий код для заполнения:

s=0
for shingle_set in make_shingle_sets.values():  # the sets of values in the dictionary
    r=0
    for row in universal_shingle_set:   # the set() of unique integers representing the rows
        if row in shingle_set:
            characteristic_matrix[r,s] = 1
        r+=1
    s+=1
...