0

我在 c# 中有一些表格数据,有大约 100 K(100000) 条记录,我必须存储在内存中。除了表格格式之外,存储这些数据的最佳方法是什么,记住我已经过滤掉了基于某些条件的结果(比如 dt.select("field1=1 and...) ,像 SQL 表一样对结果集进行排序.

请建议任何其他方式来检索数据。字典是另一种方式,但基于字段条件,如果使用字典或任何其他集合,如何检索数据。

4

1 回答 1

1

假设您追求速度并降低内存消耗,请尝试以下操作:

  1. 创建一个模型类,其中包含源表中每一列的属性。这是你的实体。
  2. 从源表中读取(如果它来自数据库,请使用 a DataReader)。逐条读取数据记录,并为每条记录创建一个实体。在读取字符串类型的每个字段的过程中,您可以稍微优化一下:
    • 优化速度:读取字符串并直接放入实体的属性中。
    • 内存优化:读取字符串,String.Intern在其上使用并放入属性中。
  3. 将所有这些实体存储在一个集合中。在这里你有两个选择:
    • 使用 aList<Entity>来存储它。您可以在列表和实体上使用 LINQ 来查询您的集合。这在性能上相当慢,但却是内存的最佳解决方案。
    • 如果您事先知道要使用哪些查询/标准,请使用一个字典作为一组标准。例如。如果您有属性“FirstName”和“LastName”,请制作一个字典,将您的实体存储为一个值,并存储Tuple<string, string>FirstName 和 LastName 的值。现在查询这些值非常快。对于排序,使用SortedDictionary. 如果键有重复项,请创建一个像这样的字典:Dictionary<Tuple<string, string>, List<Entity>>它将存储具有相同匹配的名字和姓氏的所有记录。我知道这个解决方案需要更多的编码,但速度非常快。

当然,您可以保留DataTable解决方案。如果内存是您唯一关心的问题,请尝试制作一个包含所有字符串的DataReader-wrapper 。Intern将您的包装器包裹在原件周围,DataReader并使用它来创建/填充DataTable.

于 2013-04-22T20:21:48.127 回答