表示一个巨大的矩阵/表格

本文关键字:表格 巨大 一个 表示 | 更新日期: 2023-09-27 18:28:45

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

矩阵数据如下所示:

文档ID|word1|word 2|word 3|…|word 30000|文档类
0032 1 0 0 1 P

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

需要进行的计算将使用词干或特征选择(通过使用归约技术减少单词数量),以及每个类别或每个单词等的计算。

我想到的是设计一个OOP模型来表示矩阵,然后将对象序列化到磁盘上,这样我以后就可以重用它们。例如,我将为每行或每列都有一个对象,或者可能为另一个类中包含的每个交集都有一个子对象。

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

我在这里的做法可能让我坐不住了——我走的是正确的道路吗?或者有没有更好的方法来处理如此大的数据收集。

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

表示一个巨大的矩阵/表格

您还没有解释您需要在表/矩阵上进行的计算的性质,所以我必须在那里做出假设,但如果我正确阅读了您的问题,这可能是使用关系数据库的典型案例——即使您的数据库中没有任何实际关系。如果不能使用完整的服务器,请使用SQL server Compact Edition作为嵌入式数据库,如果您选择,它将允许您以编程方式控制.SDF文件。

编辑:
经过第二次考虑,我撤回了建立数据库的建议。这完全是因为表中的列数,你使用的任何关系数据库都会对此有严格的限制,我看不出有什么方法可以不那么复杂。

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

  1. 一种分析文档中单词存在的方法。这是示例数据文件的大部分,主要是指示文档中是否存在单词的布尔值
  2. 文字本身。这主要包含在示例数据文件的第一行中
  3. 一种识别文件及其分类的方法。这是数据文件的第一列,也是最后一列

经过思考,以下是我对您的数据建模的方式:

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

    var wordMatrix=new bool[numDocuments,numWords];

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

  3. 文档标识类似地位于链接到第一列的int的索引的数组或列表中。我假设文档ID是整数值。分类将是一个类似的数组或列表,尽管我会使用enum的列表来表示分类的每个可能值。与单词搜索一样,如果需要按id搜索文档,可以使用Dictionary<int, int>作为搜索索引。

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

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