我需要在一个非常大的表或矩阵上执行计算和操作,这个表或矩阵将有大约7500行和30000列。
矩阵数据如下所示:
文件ID | word1 |字2 |字3 | ... |字30000 |文件类
0032 1 0 0 1 P
换句话说,绝大多数单元格都包含布尔值(0和1)。
需要进行的计算包括使用词干或特征选择(通过使用缩减技术减少单词数),以及每类或每单词的计算等。
我想到的是设计一个用于表示矩阵的OOP模型,然后将对象序列化到磁盘,以便稍后重用它们。例如,我将为每一行或每列提供一个对象,或者可能是另一个类中包含的每个交集的对象。
我曾考虑用XML表示它,但文件大小可能会有问题。
我可能会因为我的方法而坐在锅里 - 我是在正确的道路上,还是会有更好的方法来操纵如此大的数据集合。
这里的关键问题是性能(反应时间等),以及数据的冗余和完整性,显然我需要将数据保存在磁盘上。
答案 0 :(得分:3)
你还没有解释你需要在表格/矩阵上进行计算的性质,所以我必须在那里做出假设,但如果我正确地读出你的问题,这可能是一个海报孩子使用关系数据库的情况 - 即使您的数据库中没有任何实际关系。如果无法使用完整服务器,请将SQL Server Compact Edition用作嵌入式数据库,这样您就可以选择以编程方式控制.SDF文件。
修改强>
经过第二次考虑后,我撤回了对数据库的建议。这完全是因为表中的列数,您使用的任何关系数据库都会对此有严格的限制,而且我没有看到解决它的方法并不是非常复杂。
根据您的编辑,我会说您有三件事感兴趣:
稍微考虑一下之后,我就会对数据进行建模:
对于单词存在的情况,我觉得最好避免使用复杂的对象模型。你想要在两个方向上进行纯计算(按列和按行),在我看来,最灵活且性能最好的结构是一个简单的bool
字段的二维数组,如下所示:
var wordMatrix = new bool [numDocuments,numWords];
单词本身应该在string
的数组或列表中,这些数组或索引链接到单词矩阵的第二列 - 在示例中由numWords
定义的那一列以上。如果您需要快速搜索特定单词,可以使用Dictionary<string, int>
,将键作为单词,将值作为索引,以快速查找特定单词的索引。
文档标识同样位于链接到第一列的int
索引的数组或列表中。我假设文档ID是那里的整数值。虽然我使用代表分类的每个可能值的enum
列表,但分类将是类似的数组或列表。与单词搜索一样,如果您需要按ID搜索文档,则可以使用Dictionary<int, int>
作为搜索索引。
我已经对这个模型做了几个假设,特别是你想对所有方向的单词存在进行纯计算而不是“每个文档”。如果我错了,一个更简单的方法可能是按文档删除二维数组和模型,即单个C#Document
类,其中DocumentId
和DocumentClasification
字段为以及与单词列表索引链接的简单布尔数组。然后,您可以使用这些Document
对象的列表以及单独的单词列表。
拥有自己喜欢的数据模型后,将其保存到磁盘是最简单的部分。只需使用C#序列化。您可以选择通过XML或二进制文件保存它。二进制文件会给你最小的文件大小(我的数字略大于200MB加上30000字的列表大小)。如果包含字典查找索引,可能还需要120kB。