使用c#存储除数据表以外的表格数据

时间:2013-04-22 19:53:04

标签: c# sorting dictionary datatable store

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

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

1 个答案:

答案 0 :(得分:1)

假设您的速度低于内存消耗,请尝试以下方法:

  1. 创建一个包含每个属性的模型类 源表中的列。这是你的实体。
  2. 从源表中读取(如果它来自数据库,请使用DataReader)。按记录读取数据记录,并为每条记录创建一个实体。在读取字符串类型的每个字段时,您可以优化一点:
    • 优化速度:读取字符串并将其直接放入实体的属性中。
    • 优化内存:读取字符串,在其上使用String.Intern并输入属性。
  3. 将所有这些实体存储在一个集合中。在这里你有两个选择:
    • 使用List<Entity>存储所有内容。您可以在列表和实体上使用LINQ来查询集合。这在性能上相当慢,但却是内存的最佳解决方案。
    • 如果您事先知道要使用哪些查询/标准,请使用一个词典来表示一组标准。例如。如果您具有“FirstName”和“LastName”属性,请创建一个字典,将您的实体存储为值,并将Tuple<string, string>存储为FirstName和LastName的值。现在查询这些值非常快。要进行排序,请使用SortedDictionary。如果某个键有重复项,请创建一个这样的字典:Dictionary<Tuple<string, string>, List<Entity>>,它将存储具有相同匹配的名字和姓氏的所有记录。我知道这个解决方案需要更多编码,但速度非常快。
  4. 当然,您可以保留DataTable解决方案。如果内存是您唯一关注的问题,请尝试制作一个DataReader - 包装器,它将Intern所有字符串。将原包装DataReader包裹起来并用它来创建/填充DataTable