代码之家  ›  专栏  ›  技术社区  ›  caesay

构建可扩展服务器

  •  1
  • caesay  · 技术社区  · 15 年前

    所以我正在开发一个服务器应用程序,它必须存储数十万个类(在某些情况下可达几百万个),将它们序列化到一个SQL数据库,并将它们重新加载几次,而且似乎将许多类对象存储到一个列表中是引发内存不足异常的原因?我想。

    所以这就带来了问题

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

    这个问题的关键是,我需要在内存中运行这么多的类,因为我需要不断地更新它们,更新的方式比我想序列化到SQL数据库所花费的时间要长。现在,现在,我使用的内存比我最终需要的还要少!

    3 回复  |  直到 15 年前
        1
  •  3
  •   Victor Nicollet    15 年前

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

    可扩展的处理体系结构通常包括以下内容:

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

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

    为了利用短列表中未使用的内存,在代码和数据库之间插入一个缓存层,这样,如果您最终大量获取同一对象,那么这样做的成本将会降低。缓存策略意味着只有在内存可用的情况下,软件才会以内存换速度。

    尝试使用读一些东西的小事务,写一些东西回来,然后重新开始。这有助于您的软件在处理过程中发生崩溃或停机时从其离开的位置恢复。数据库应该足够从它离开的地方重新启动。

    通过处理独立事务,可以让多个工作进程(在同一台计算机上或在计算网格上)在同一个数据库上工作。如果可以的话,实现一个基于事务性工作者的模型对于性能来说是很好的,并且可以让更多的计算机更容易地处理这个问题。

        2
  •  0
  •   Community Mohan Dere    9 年前

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

    其次,如果您真的需要数百万个对象,重新考虑您的设计可能是有意义的。在许多情况下,一些简单的东西,比如一个大的多维数组 可以 比复杂的.NET类树效率更高(而且更容易预测内存)。不管这个建议是否适用于你的案件,我不能用手头的数据来说明。

    第三,如果不需要将所有这些数据存储在内存中 同时 ,那就不要这样做。目前,SQL数据库速度相当快(并且使用智能缓存机制),因此只有列表中当前需要的对象(而不是将所有内容加载到内存中)可能是有意义的。此外, 搜索 通过一个SQL数据库索引甚至可能比遍历一个巨大的内存列表更快。

        3
  •  0
  •   jocull    15 年前

    它可能值得缓存一些经常被读取到类似memcached的数据库数据。 http://en.wikipedia.org/wiki/Memcached

    推荐文章