Эффективно хранить большую разреженную матрицу (с плавающей запятой)

Я ищу решение для хранения около 10 миллионов чисел с плавающей запятой (двойной точности) разреженной матрицы. Матрица на самом деле представляет собой двумерную треугольную матрицу, состоящую из 1 миллиона на 1 миллион элементов. Элемент (i,j) является фактическим показателем оценки score(i,j) между элементом i и элементом j. Метод хранения должен обеспечивать очень быстрый доступ к этой информации, возможно, путем отображения в памяти файла, содержащего матрицу. Я, конечно, не хочу загружать весь файл в память.

class Score(IsDescription):
    grid_i = UInt32Col()
    grid_j = UInt32Col()
    score  = FloatCol()

Я пробовал pytables, используя открытый класс Score, но я не могу получить прямой доступ к элементу i,j без сканирования всех строк. Любое предложение?


person nopper    schedule 25.01.2013    source источник
comment
нет опыта работы с pyTables или «(не очень) большими» данными - но возможно ли/достаточно ли сопоставить с 1D-индексом ??   -  person Theodros Zelleke    schedule 25.01.2013
comment
spyddles.blogspot.com/2008/ 06/   -  person Dima Tisnek    schedule 25.01.2013


Ответы (2)


10 миллионов чисел двойной точности занимают 80 МБ памяти. Если вы сохраните их в разреженной матрице 1 миллион x 1 миллион, в CSR или CSC вам потребуется дополнительно 11 миллионов int32, что в сумме составит около 125 МБ. Вероятно, это менее 7% физической памяти в вашей системе. И по моему опыту, в системе с 4 ГБ, работающей под управлением 32-разрядной версии Python, у вас редко возникают проблемы с выделением массивов, пока вы не попытаетесь получить в десять раз больше.

Запустите следующий код на своем компьютере:

for j in itertools.count(100) :
    try :
        a = np.empty((j * 10**6,), dtype='uint8`)
        print 'Allocated {0} MB of memory!'.format(j)
        del a
    except MemoryError:
        print 'Failed to allocate {0} MB of memory!'.format(j)
        break

И если вам не удастся получить по крайней мере в 4 раза больше суммы, рассчитанной выше, даже не колеблясь запихивайте все это в память, используя формат scipy.sparse.

У меня нет опыта работы с pytables и с массивами memmap numpy. Но мне кажется, что любой из них потребует от вас кодирования логики для обработки разреженности, чего я бы постарался избежать, если это невозможно.

person Jaime    schedule 25.01.2013

Вы должны использовать scipy.sparse. Вот дополнительная информация о форматах и ​​использовании.

person tiago    schedule 25.01.2013