在内存中保存一个大集合,用于查询

时间:2010-11-17 03:47:16

标签: c# asp.net

例如,在我的ASP.Net应用程序中,无限期地将IEnumerable保存在内存中是否可以?

例如:

每天早上,我的asp.net mvc应用都需要从CSV文件中加载数据。 这些数据是从几个CSV文件加载的,然后使用LINQ连接等。它被合并为一个单一的,非规范化的集合,大约500,000个“东西”

应用程序的唯一目的是查询此数据。 方法如:

  • GetThingsByName
  • GetThingsByPrice

等...

我的想法是只有控制器可以调用的静态IEnumerable。?

它将在专用服务器上运行......

基本上,我试图避免使用数据库(任何类型,NoSQL或其他),因为我认为不需要它,因为数据相当不稳定。

查询将使用LINQ完成。

5 个答案:

答案 0 :(得分:5)

我同意帕维尔的观点。它还高度依赖于您将要运行的查询类型。如果您正在进行大量聚合,那么您可能需要像SQLite这样的内存数据库,甚至可能需要像MySQL或SQL Server这样的完整数据库。如果您只是通过PK进行查找,那么您可能会将数据存储在HashMap或类似内容中。

IEnumerable和LINQ-to-Objects并不神奇。它们只是为查询和聚合提供了一个通用接口。如果您的IEnumerable的实际实现类是List,猜猜是什么?当你说:

var query = from item in items  // items is a List<T>
            where item.Name.StartsWith("Foo")
               && item.CreationDate > new DateTime(2010,1,1)
            select item;
var allFoos = query.ToList();

然后LINQ-to-Objects将遍历内存中的所有500,000个对象,检查是否满足where子句。将不会发生索引或其他查询优化。你将通过记忆进行线性搜索!

答案 1 :(得分:3)

你持有什么样的结构记录?因为只是在同一句话中看到“IEnumerable”,“500 000”和“查询”这些词语让我感到沮丧(看看LINQ是如何运作的,你会明白的)。
您是否考虑过使用内存数据库等其他选项?例如SQLite

答案 2 :(得分:0)

如果你有内存,丢失数据不是问题,并且很容易将其与数据的“主”源同步,那么我认为这种方法没有问题。如果不了解数据的结构和原始来源,就很难再说了。

答案 3 :(得分:0)

这完全取决于您需要使用多少内存以及这些数据结构的大小。我们是在谈论布尔和整数还是更大的复杂类型,占用了大量的内存?

访问这些记录的次数以及从数据库访问需要多长时间?

更多的统计数据会很好。

答案 4 :(得分:0)

这是可行的。我在一个类似的系统上工作,只保留(大)内存中的2千万个项目。按主键访问(仅限)。 Ther是一些其他元素(相关项目),但我从数据库中获得了那些罕见的评估的pk。

我的问题是这些元素一直在变化。这意味着接受PER SECOND的数量(有时是数十万)。

Iti是一个罕见的案例,在这种护理案例中,保持记忆力几乎是“它”(如:唯一的方法)。服务器每周重启一次(GC在这里没用 - 如果一个项目被淘汰,那么在最后一个GC“切片”中它将是......)给一个chacne开始新鲜。 Memroy用过吗?大(需要64位),但它是可行的。只有这里。还会记录更改,然后将其处理到数据库中以供以后查询。

如果你可以,请远离这样的方法。

  

应用程序的唯一目的是查询此内容   数据。方法如:

     

•GetThingsByName•GetThingsByPrice

在这里,你离开了。如果没有Index,GetThingsByPrice将无法工作,并且内存中的索引是HARD(我不这样做 - 按符号获取....这是一个“名称”....是我在内存中支持的唯一搜索方法)。而且很可能不值得努力。如果需要查询,请将其推送到真实数据库。 James Kovacs在他的回答中指出了这一点。一个简单的IEnumeable将无法工作,你将不得不实现一个完整的LINY quer4y提供程序,包括......高级搜索评估(哪个订单等),这是NASTY。即使看起来很糟糕......我在这里使用了一个特殊的API(没有LINY),你在其中输入名称,并在哈希表中进行参考查找。