代表一个巨大的矩阵/表

时间:2012-03-22 15:02:08

标签: c# oop

我需要在一个非常大的表或矩阵上执行计算和操作,这个表或矩阵将有大约7500行和30000列。

矩阵数据如下所示:

文件ID | word1 |字2 |字3 | ... |字30000 |文件类
0032 1 0 0 1 P

换句话说,绝大多数单元格都包含布尔值(0和1)。

需要进行的计算包括使用词干或特征选择(通过使用缩减技术减少单词数),以及每类或每单词的计算等。

我想到的是设计一个用于表示矩阵的OOP模型,然后将对象序列化到磁盘,以便稍后重用它们。例如,我将为每一行或每列提供一个对象,或者可能是另一个类中包含的每个交集的对象。

我曾考虑用XML表示它,但文件大小可能会有问题。

我可能会因为我的方法而坐在锅里 - 我是在正确的道路上,还是会有更好的方法来操纵如此大的数据集合。

这里的关键问题是性能(反应时间等),以及数据的冗余和完整性,显然我需要将数据保存在磁盘上。

1 个答案:

答案 0 :(得分:3)

你还没有解释你需要在表格/矩阵上进行计算的性质,所以我必须在那里做出假设,但如果我正确地读出你的问题,这可能是一个海报孩子使用关系数据库的情况 - 即使您的数据库中没有任何实际关系。如果无法使用完整服务器,请将SQL Server Compact Edition用作嵌入式数据库,这样您就可以选择以编程方式控制.SDF文件。

修改
经过第二次考虑后,我撤回了对数据库的建议。这完全是因为表中的列数,您使用的任何关系数据库都会对此有严格的限制,而且我没有看到解决它的方法并不是非常复杂。

根据您的编辑,我会说您有三件事感兴趣:

  1. 分析文档中单词存在的方法。这是样本数据文件的主要部分,主要是布尔值,表示文档中是否存在单词。
  2. 这些话本身。这主要包含在示例数据文件的第一行中。
  3. 识别文件及其分类的方法。这是数据文件的第一列和最后一列。
  4. 稍微考虑一下之后,我就会对数据进行建模:

    1. 对于单词存在的情况,我觉得最好避免使用复杂的对象模型。你想要在两个方向上进行纯计算(按列和按行),在我看来,最灵活且性能最好的结构是一个简单的bool字段的二维数组,如下所示:

      var wordMatrix = new bool [numDocuments,numWords];

    2. 单词本身应该在string的数组或列表中,这些数组或索引链接到单词矩阵的第二列 - 在示例中由numWords定义的那一列以上。如果您需要快速搜索特定单词,可以使用Dictionary<string, int>,将键作为单词,将值作为索引,以快速查找特定单词的索引。

    3. 文档标识同样位于链接到第一列的int索引的数组或列表中。我假设文档ID是那里的整数值。虽然我使用代表分类的每个可能值的enum列表,但分类将是类似的数组或列表。与单词搜索一样,如果您需要按ID搜索文档,则可以使用Dictionary<int, int>作为搜索索引。

    4. 我已经对这个模型做了几个假设,特别是你想对所有方向的单词存在进行纯计算而不是“每个文档”。如果我错了,一个更简单的方法可能是按文档删除二维数组和模型,即单个C#Document类,其中DocumentIdDocumentClasification字段为以及与单词列表索引链接的简单布尔数组。然后,您可以使用这些Document对象的列表以及单独的单词列表。

      拥有自己喜欢的数据模型后,将其保存到磁盘是最简单的部分。只需使用C#序列化。您可以选择通过XML或二进制文件保存它。二进制文件会给你最小的文件大小(我的数字略大于200MB加上30000字的列表大小)。如果包含字典查找索引,可能还需要120kB。