gpt4 book ai didi

c# - 代表一个巨大的矩阵/表格

转载 作者:行者123 更新时间:2023-11-30 22:30:09 27 4
gpt4 key购买 nike

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

矩阵数据将如下所示:

文件编号|字1 |字 2 |字 3 |... |字 30000 |文档类
0032 1 0 0 1P

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

需要做的计算是使用词干提取或特征选择(通过减少技术来减少词的数量),以及每类或每词的计算等。

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

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

我在这里的做法可能会错过底池 -我是在正确的道路上,还是会有更好的方法来处理如此大的数据集合。

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

最佳答案

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

编辑:
经过再三考虑,我撤回了数据库的建议。这完全是因为表中的列数,您使用的任何关系数据库都会对此有硬性限制,而且我没有看到一种不是非常复杂的解决方法。

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

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

稍微考虑一下后,我将如何为您的数据建模:

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

    var wordMatrix = new bool[numDocuments,numWords];

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

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

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

一旦您有了喜欢的数据模型,将其保存到磁盘就是最简单的部分。只需使用 C# 序列化。您可以选择通过 XML 或二进制文件保存它。二进制自然会为您提供最小的文件大小(我估计略多于 200MB 加上 30000 字列表的大小)。如果包括字典查找索引,可能需要额外的 120kB。

关于c# - 代表一个巨大的矩阵/表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com