2009-11-02 80 views
1

我正在构建的商业应用程序将持有50,000到150,000家公司之间的某个地方。每个公司(db行)用4-5个属性/列(标题,位置...)表示。 ORM是LINQ2SQL。共享托管服务提供商的可用RAM

我必须做一些计算,并为此我有很多具体的公司查询。现在,每当我需要某些东西时,我都会去db,根据计算complexy,它会产生50-200个查询。我试图让所有公司缓存,而对于数据库中的10,000行(公司),它需要大约5,5MB的缓存。在这种情况下,我只有一个查询。

此应用程序将在共享的托管服务器上,所以我的资源是有限的。我很感兴趣,如果我尝试加载,会发生什么事情,比如说100,000个公司(行,对象)?或者把它放在缓存中?
平均托管公司给ASP.NET应用程序有任何RAM限制吗?它是否依赖于专用Applcation Pool(我可以将应用程序放到专用池中)?

选项是
- 将整个表加载到c#对象。 Id做了一些内存分析,10,000个对象需要5MB RAM
- 查询db以在需要时获取引用对象。

任务是:对于给定的公司A,建立关联公司的树。

表和列
公司:IdCompany,职务,地址,联系
CompanyConnection: IdParentCompany,IdChildCompany

+0

为什么需要50-200个查询,tho?如果你懒加载大量的数据,你应该预先加载子行。 – JustLoren 2009-11-02 16:04:19

+0

每家公司都有一家或多家其他公司(多对多关系)。我有c#中的递归函数,通过公司树(从父母到每个孩子,等等),并寻找一些东西。当我想要儿童公司时,我需要查询db。也许这一切都可以在存储过程中完成,但是我在SQL中并不擅长,而且我为了让自己的业务逻辑保持在c#(DDD风格的应用程序) – 2009-11-02 18:05:30

回答

1

你的共享主机将可能是IIS 7的Windows Server上运行的虚拟机。这台机器将像任何普通机器一样工作 - 它不会“知道”共享或虚拟化。

当物理内存不足时,您应该期望Windows开始分页到磁盘,然后只有在页面文件填满磁盘时才会抛出内存不足错误。当然,你永远不想将热缓存的任何部分分页到磁盘。 Windows本身可以开始唠叨你关于内存不足,但这不是紧急情况,应用程序将继续能够请求RAM,它将继续提供(尽管从页面文件中提供服务)。

如果您的应用程序可能会崩溃并且保留了损坏状态或部分事务,那么您应该在防御方面进行编码,并在开始操作之前检查内存是否可用。

使用伪装数据在循环中创建预期数目的对象,并观察盒子上的内存消耗 - 工作进程的工作集是要观察的对象。您可以在任务管理器中执行此操作。

注意页面错误。这些是当内存操作必须被定向到磁盘时的事件。

此外,非常大的对象集可能导致长时间的垃圾收集周期大于1秒。这对于交易和市场数据等时间敏感的应用来说可能是一个大问题。

希望有所帮助。

更新:我做了一个类似的超大型数据挖掘应用缓存。

每个ORM类型都有它采用一个巨大的缓存或去到磁盘,然后更新缓存GetObject方法:Person.GetPerson(检查人缓存,去分贝,加人缓存)

现在我的查询只返回结果的唯一键。然后使用上述方法获取每个密钥。这是最初缓慢,直到缓存建立,但...

这一点是,每个查询结果指向内存中的同一个实例!这意味着由于共享,RAM占用空间更小。

查询结果也被缓存。当然。

如果对象不是不可变的,则每个对象都会在巨型缓存中更新其自己的实例,但也会导致涉及该类型对象的所有查询缓存自行失效!

当然,在这个应用程序中,写入作为其主要参考数据是罕见的。

相关问题