Производительность симметричной разреженной матрицы измерения 5 000 000: сохранить в базу данных или файл? - PullRequest
1 голос
/ 18 августа 2011

У меня есть огромный набор данных (около 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 в python?

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

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

0 голосов
/ 18 августа 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)

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

...