Эффективное хранение памяти многих больших scipy разреженных матриц

Мне нужно хранить около 50 000 scipy разреженных матриц csr, где каждая матрица представляет собой вектор длиной 3,7 миллиона:

x = scipy.sparse.csr_matrix((3.7Mill,1))

В настоящее время я храню их в простом словаре, потому что мне также нужно знать соответствующий ключ для каждого вектора (в данном случае ключ — простое целое число).

Проблема сейчас в том, что требуется огромный объем памяти. Есть ли более эффективные способы?


person fsociety    schedule 24.10.2012    source источник
comment
Вы можете хранить их в одной матрице вместо 50 тысяч. Вы также можете использовать dtype меньшего размера. Для чего нужны эти матрицы?   -  person Fred Foo    schedule 24.10.2012
comment
Спасибо, так просто, и я думаю, что теперь я решил свои проблемы. ;)   -  person fsociety    schedule 24.10.2012


Ответы (1)


Попробуйте использовать структуры данных Lazy.

Например:

def lazy(func):
    def lazyfunc(*args, **kwargs):
        temp = lambda x : func(*args, **kwargs)
        temp.__name__ = "lazy-" + func.__name__
        return temp
    return lazyfunc

"""
Add some simple functions
"""
def add(x, y):
    print "Not lazy"
    return x + y

@lazy
def add_lazy(x, y):
    print "lazy!"
    return x + y

Использование:

>>> add(1, 2)
Not lazy
3
$ add_lazy(1, 2)
<function lazy-add_lazy at 0x021E9470>
>>> myval = add_lazy(1, 2)
>>> myval()
lazy!
3

Смотреть на:

person ymn    schedule 24.10.2012
comment
Спасибо за подсказку, звучит многообещающе. Если я понимаю это право, этот метод откладывает выполнение до тех пор, пока оно не потребуется. Но в моем случае я также заранее заполняю разреженные матрицы, а затем передаю их в словарь. Итак, я создаю эти 50 тысяч разреженных векторов, заполняю их, а затем добавляю в словарь. Возможно ли это также с помощью этого ленивого метода? - person fsociety; 24.10.2012
comment
Конечно, почему бы и нет? Вроде никаких проблем быть не должно. - person ymn; 24.10.2012