2011-08-18 68 views
1

我有一个庞大的数据集(数据库中大约有5 000 000行),我想用图来表示。出于算法原因,需要将数据集存储在邻接矩阵中。矩阵将是非常稀疏和对称尺寸为5 000 000的对称稀疏矩阵的性能:保存到数据库还是文件?

首先我想到了将图存储在数据库表中。这将需要5000000行,这应该没有问题。但500万列?我不知道很多数据库,但我有这种感觉,这不是推荐的方式。

经过谷歌搜索后,我发现SciPy有几个稀疏矩阵对象。 lil_matrix和coo_matrix似乎是我需要的。

由于我将使用python操作这个矩阵,SciPy似乎是一个很好的理由。现在的问题是如何存储图形又称稀疏矩阵?

我应该使用csv文件吗?我应该使用coo_matrix将矩阵保存到daatabase_table中吗?两者都会导致大约2 500 000 000行/行

或者是有没有更好的方法来创建和存储这样一个对称和稀疏的“矩阵”维度大约5 000 000蟒蛇?

我在Python中使用numpy和一些自写算法,我想在矩阵上运行它。所以这将是很酷的,如果建议可以很容易地在图上使用python。

我不知道我是否提供了足够的答案信息。如果您需要更多信息:请随意在评论中提问。我会很乐意编辑我的答案。

在此先感谢您的任何建议!

回答

2

您可以使用numpy稀疏矩阵格式。但是,所有的问题都取决于矩阵中非零元素的个数(NNZ)。存储和大量计算仅与NNZ有关(大约)。 Start here

0

我建议使用一个字典来表示矩阵,如果您需要一个简单的访问,您可以将它包装在一个类中。

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核心实现,具有额外的处理仅每吨存储值的一半。