Производительность симметричной разреженной матрицы размерностью 5 000 000: сохранить в базу данных или в файл?

У меня есть огромный набор данных (около 5 000 000 строк в базе данных), который я хочу представить в виде графика. По алгоритмическим причинам необходимо хранить набор данных в матрице смежности. Матрица будет очень разреженной и симметричной.

Сначала я подумал о сохранении графика в таблице базы данных. Для этого потребуется 5 000 000 строк, что не должно быть проблемой. Но 5 000 000 столбцов? Я не очень хорошо разбираюсь в базах данных, но у меня такое чувство, что это не рекомендуемый способ сделать это.

После некоторого поиска в Google я нашел SciPy, в котором есть несколько объектов Sparse Matrix. lil_matrix и coo_matrix кажутся мне нужными.

Поскольку я буду работать с этой матрицей, используя python, SciPy кажется хорошей причиной для перехода. Вопрос для меня сейчас заключается в том, как хранить граф, известный как разреженная матрица?

Должен ли я использовать файл csv? Должен ли я использовать coo_matrix для сохранения матрицы в daatabase_table? В обоих случаях получается около 2 500 000 000 000 строк/строк.

Или есть гораздо лучший способ для создания и хранения такой симметричной и разреженной «Матрицы» размером около 5 000 000 в питоне?

Я использую numpy и некоторые самописные алгоритмы на python, которые я хочу запустить на матрице. Так что было бы здорово, если бы предложения облегчили использование python на графике.

Не знаю, предоставил ли я достаточно информации для ответа. Если вам нужна дополнительная информация: не стесняйтесь спрашивать меня в комментарии или около того. Я с удовольствием отредактирую свой ответ.

Заранее спасибо за любое предложение!


person Aufwind    schedule 18.08.2011    source источник


Ответы (2)


Вы можете использовать формат разреженной матрицы numpy. Но все ваши вопросы зависят от количества ненулевых элементов (NNZ) в матрице. Хранение и множество вычислений зависят (примерно) только от NNZ. Начните здесь.

person Peter    schedule 18.08.2011

Я предлагаю использовать dict для представления матрицы, которую вы можете обернуть в класс, если вам нужен простой доступ.

class SymmetricSparseMatrix:
    def __init__(self, nlines, ncols):
        self.nlines = nlines
        self.ncols = ncols
        self._dict = {}

    def _check_coords(self, coords):
        """check coordinate range, and permutate i and j if necessary to 
        take advantage of the symmety of the matrix"""
        i, j = coords
        if not(0 <= i < self.nlines) or not(0 <= j < self.ncols):
            raise ValueError(coords)
        if i > j:
            return j, i
        else:
            return coords

    def __setitem__(self, coords, val):
        coords = self._check_coords(coords)
        self._dict[coords] = val
        if val == 0:
            del self._dict[coords]

    def __getitem__(self, coords):
        coords = self._check_coords(coords)
        return self._dict.get(coords, 0)

Это очень близко к основной реализации scipy dok_matrix, с дополнительной обработкой, которая хранит только половину значений.

person gurney alex    schedule 18.08.2011