在5000万记录c#nhibernate的内存中

时间:2016-09-19 10:52:53

标签: c# nhibernate

如何在5000万条记录中处理Out Of Memory nhibernate,我在nhibernate中使用无状态会话并解决约170万条记录,但这对我的报告不利。 另一件事是我需要计算它们所以我不能分开结果。 你能让我知道如何优化吗?

 "autoload": {
      "psr-4": {
        "CompanyName\\PackageName\\": "packages/package-folder/src/"
    }
  }

1 个答案:

答案 0 :(得分:0)

我假设你在x86(32位)上运行。 .NET中的数组(或List<T>)必须存储在连续的内存块中,因此50个项目的列表将需要一个超过200MB的单个块来存储每个实例的地址。 ATMDispenseReport(这将在多次实例化后发生,因为列表会动态增长。)

虽然32位应用程序的内存限制为2GB,但如果你已经拥有大量内存并且内存碎片化,那么你可能没有足够大的连续区域。然后你还有5000万ATMDispenseReport个对象,它们不需要连续分配,但它们可能至少比4字节指针大10倍。

  1. 肮脏的黑客?切换到x64并检查本机是否有足够的RAM。您可能也需要<gcAllowVeryLargeObjects>。请注意,对于平均大小为~40B的对象,您将需要超过2GB的RAM。对于单个查询来说,这似乎有点奇怪,因为我怀疑你的用户是否真的需要所有这些行。

  2. 简单的解决方案?如果您确实需要枚举所有结果,请将List<T>()替换为Enumerable<T>()并枚举结果。这将懒惰地传输数据,因此您只需要随时在内存中保留一个元素。但请记住,所有这些数据仍然需要通过您的应用程序用于连接到DBMS服务器的套接字来提供。我们可能正在谈论几GB的数据。

  3. 更好的解决方案?在重新启动应用之前,重写SQL以汇总SQL端的所有数据。让DBMS服务器完成所有工作。