构建可伸缩的服务器

时间:2010-11-08 13:57:59

标签: c# .net scalability out-of-memory

所以我正在开发一个服务器应用程序,它必须存储数十万个(在某些情况下几百万个)类,将它们序列化到SQL数据库,并将它们加载几次,看来将许多类对象存储到List中是什么引发内存不足异常?我想。

这就带来了问题

  • 如何在处理我所有的百万左右的课程时如何避免此类错误?
  • 有这么多数据可以带来其他问题吗?
  • 我还能做些什么来确保我的服务器完全可扩展,最终可以处理和管理尽可能多的数据?

这个问题的关键在于,我需要在内存中运行这么多的类,因为我需要不断更新它们,这比我想要序列化到SQL数据库要花费更长的时间。现在,目前,我使用更少的内存然后我最终需要甚至!

3 个答案:

答案 0 :(得分:3)

你可能是指对象,而不是类; - )

可扩展的处理架构通常涉及以下内容:

在任何时间点,内存中只有有限数量的对象(可能是一个,可能是十个,可能是一百个,但如果它必须是“无论多少我需要”那么你必须重新思考你的设计)。这可确保您永远不会耗尽内存,因为最大内存使用量是固定的。

所有对象都存储在数据库中。当您需要一个不在内存中的对象时,从数据库加载它。除非它是前面提到的短对象列表的一部分,否则不要保留它。

要利用短名单未使用的内存,请在代码和数据库之间插入一个缓存层,这样,如果最终获取相同的对象,那么这样做的成本会降低。缓存策略意味着如果有可用内存,您的软件将只交换内存以提高速度。

尝试使用读取某些内容的小事务,写回一些内容,然后重新开始。这可以帮助您的软件从它离开的地方恢复,如果在处理过程中发生崩溃或中断。数据库应该足以从它离开的地方重新开始。

通过处理独立事务,可以在同一个数据库上运行多个工作进程(在同一台计算机上或计算网格上)。如果可以的话,实现基于事务工作者的模型对于提高性能非常有用,并且可以让更多计算机更容易解决问题。

答案 1 :(得分:0)

首先,显而易见:确保你有足够的RAM。分析您的代码,以便(大约)同时查找内存中有多少个对象,然后使用内存分析器。请参阅此相关问题:How much memory does a C#/.NET object use?

其次,如果你真的需要数百万个对象,重新考虑你的设计可能是有意义的。在许多情况下,类似于大型多维数组的东西可能<。em>比复杂的.net类树更高效(并且更可预测内存)。无论这个建议是否适用于您的案例,我都不能用手头的数据说明。

第三,如果没有必要同时将所有这些数据都存储在内存中,那么就不要这样做了。 SQL数据库现在非常快(并且使用智能缓存机制),因此在列表中只包含您当前需要的对象(而不是将所有内容加载到内存中)可能是有意义的。此外,通过SQL数据库索引搜索甚至可能比遍历大量的内存列表更快。

答案 2 :(得分:0)

可能值得缓存一些经常被读入Memcached的数据库数据。 http://en.wikipedia.org/wiki/Memcached