例如,在我的ASP.Net应用程序中,无限期地将IEnumerable保存在内存中是否可以?
例如:
每天早上,我的asp.net mvc应用都需要从CSV文件中加载数据。 这些数据是从几个CSV文件加载的,然后使用LINQ连接等。它被合并为一个单一的,非规范化的集合,大约500,000个“东西”
应用程序的唯一目的是查询此数据。 方法如:
等...
我的想法是只有控制器可以调用的静态IEnumerable。?
它将在专用服务器上运行......
基本上,我试图避免使用数据库(任何类型,NoSQL或其他),因为我认为不需要它,因为数据相当不稳定。
查询将使用LINQ完成。
答案 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),你在其中输入名称,并在哈希表中进行参考查找。