我正在开发商业应用程序,它能容纳5万到15万家公司。每个公司(db行)都用4-5个属性/列表示(标题、位置、.)。ORM是LINQ2SQL。
我必须做一些计算,为此,我对特定的公司有很多疑问。现在,我每次需要的时候都会访问db,它会产生50-200个查询,这取决于计算的复杂性。我试图将所有公司都缓存起来,对于db中的10,000行(公司),它需要大约5,5MB的缓存。在这个场景中,我只有一个查询。
此应用程序将位于共享主机服务器上,因此我的资源有限。我很感兴趣,如果我尝试加载,比如说100,000家公司(行,对象),会发生什么?还是把它藏起来?
普通托管公司对ASP.NET应用是否有内存限制?它是否依赖于专用的应用程序池(我可以将应用程序放到专用池中)?
选项是
任务是:对于给定的公司A,建立连接的公司树。
表和列
公司: IdCompany,头衔,地址,联系方式
CompanyConnection: IdParentCompany,IdChildCompany
发布于 2009-11-23 22:34:21
您的共享主机可能是作为虚拟机运行的Windows Server上的IIS 7。这台机器将像任何普通机器一样运行--它不知道被共享或虚拟化。
您应该期望Windows在磁盘没有物理RAM时开始分页到磁盘,然后只有在页文件填充磁盘时才会抛出内存错误。当然,您永远不希望将温缓存的任何部分分页到磁盘。
Windows本身可以开始唠叨您内存不足,但这与“紧急情况”不同,应用程序将继续请求RAM,并将继续提供内存(尽管是从页面文件中提供服务)。
如果应用程序可能崩溃,并留下损坏的状态或部分事务,则应该进行防御编码,并在开始操作之前检查内存是否可用。
用假装的数据在循环中创建预期的对象数,并观察框上的内存消耗--工作进程的工作集就是要观察的。您可以在任务管理器中这样做。
注意页码错误。这些事件是当内存操作必须定向到磁盘时发生的。
而且,非常大的对象集会导致垃圾收集周期超过1秒。在像交易和市场数据这样的时间敏感应用程序中,这可能是一个大问题。
希望这能有所帮助。
更新:我为一个大型数据挖掘应用程序做了类似的缓存。
每个ORM类型都有一个GetObject方法,它使用一个巨大的缓存或进入磁盘,然后更新缓存: Person.GetPerson(检查人员缓存,转到db,添加到人员缓存)
现在,我的查询只返回结果的唯一键。然后使用上述方法获取每个密钥。一开始很慢直到缓存建立起来但是..。
关键是每个查询结果指向内存中的同一个实例!这意味着由于共享,内存占用要小得多。
查询结果也会被缓存。当然了。
在对象不是不可变的情况下,每个对象写入都会在巨大的缓存中更新自己的实例,但也会导致所有与该对象类型有关的查询缓存本身失效!
当然,在这个应用程序中,写作为主要的参考数据是很少见的。
https://stackoverflow.com/questions/1662138
复制相似问题