Javascript k是一个无法回答的问题,或者至少是一个错误的问题。然而,评论中的@Steve给了我这个问题最合适的信息

Javascript k是一个无法回答的问题,或者至少是一个错误的问题。然而,评论中的@Steve给了我这个问题最合适的信息,javascript,orm,breeze,Javascript,Orm,Breeze,它既不是微风,也不是浏览器,而是击倒。显然,breeze实体周围的敲除包装器使用了所有内存(至少在加载实体和我的环境中)。如上所述,Knockout/Breeze会在读取大约5MB的数据后崩溃,导致Chrome崩溃,内存使用量超过1.7GB(预下载内存使用量约为300MB)。用ANgularJS重写应用程序消除了这个问题。到目前为止,我已经能够从完全相同的EF6型号下载超过50MB的内存到Breeze/Angular,Chrome的总内存使用量从未超过625MB 我将测试更大的有效负载,但目前比

它既不是微风,也不是浏览器,而是击倒。显然,breeze实体周围的敲除包装器使用了所有内存(至少在加载实体和我的环境中)。如上所述,Knockout/Breeze会在读取大约5MB的数据后崩溃,导致Chrome崩溃,内存使用量超过1.7GB(预下载内存使用量约为300MB)。用ANgularJS重写应用程序消除了这个问题。到目前为止,我已经能够从完全相同的EF6型号下载超过50MB的内存到Breeze/Angular,Chrome的总内存使用量从未超过625MB



我将测试更大的有效负载,但目前比我需要的多50MB。谢谢大家的帮助。

您能提供一些关于您的数据的更多信息吗?是否可以为正在缓存的实体提供元数据?这可能有助于确定某个地方是否存在导致问题的bug。Steve,感谢您的关注。更新了问题以提供更多信息。在测试中,您如何处理查询结果?把它们扔掉?储存它们?在请求之间使用
manager.clear()
清除缓存?试图了解哪个阶段会导致问题。我相信每个浏览器都有自己的有效负载大小瓶颈,但我怀疑这就是问题所在。我倾向于“记忆中的实体太多”,在这种情况下,我们需要重新思考你的方法。沃德,好问题。现在,我对请求之间的数据不做任何处理。我只是想把数据放到缓存里。当我需要这些数据时,我将以查询方式加载并处理这些数据。一个有趣的事实:如果我读取4MB的数据,浏览器的内存使用量会增加大约600MB(增加三倍,或者在IE的情况下,增加四倍,并使用额外的1+gig内存)。然而,如果我导出实体以将它们保存在本地存储中,整个JSON字符串大约为4GB。因此,在实际下载/处理过程中发生的一些事情占用了系统内存。有什么想法吗?关于内存大小,在将实体属性包装到敲除观察值中时会使用大量额外内存。使用敲除模型库所需的内存量是AngularJS属性所需内存量的3倍以上。能否提供有关数据的更多信息?是否可以为正在缓存的实体提供元数据?这可能有助于确定某个地方是否存在导致问题的bug。Steve,感谢您的关注。更新了问题以提供更多信息。在测试中,您如何处理查询结果?把它们扔掉?储存它们?在请求之间使用
manager.clear()
清除缓存?试图了解哪个阶段会导致问题。我相信每个浏览器都有自己的有效负载大小瓶颈,但我怀疑这就是问题所在。我倾向于“记忆中的实体太多”,在这种情况下,我们需要重新思考你的方法。沃德,好问题。现在,我对请求之间的数据不做任何处理。我只是想把数据放到缓存里。当我需要这些数据时,我将以查询方式加载并处理这些数据。一个有趣的事实:如果我读取4MB的数据,浏览器的内存使用量会增加大约600MB(增加三倍,或者在IE的情况下,增加四倍,并使用额外的1+gig内存)。然而,如果我导出实体以将它们保存在本地存储中,整个JSON字符串大约为4GB。因此,在实际下载/处理过程中发生的一些事情占用了系统内存。有什么想法吗?关于内存大小,在将实体属性包装到敲除观察值中时会使用大量额外内存。使用敲除模型库需要的内存量是AngularJS属性所需内存量的3倍以上。Jeremy,谢谢你的想法。它们看起来像是一些好主意,我会尽快尝试。几个问题:1)如果我使用notracking,是否会破坏关系和LINQ功能?2} 我已经引入了过滤器,以使总有效负载低于某个特定的大小,但目前该大小是一个移动目标,3)与#1相同的问题。我想保留关系和LINQ能力,但可能我不明白单独的实体经理会做什么,4)我不认为这是一个问题,因为导出工作非常出色。我将研究所有这些选项。当使用noTracking时,仍然会得到linq风格的查询内容(where、orderBy、expand等)。不同之处在于,查询的结果不会转换为实体并由EntityManager跟踪,从而使客户端处理最小化。例如,假设您的用户需要在脱机时创建新的客户端实体。创建新客户机不需要地区实体。您可以使用noTracking加载地区列表,并使用DistrictId和名称在新客户端窗体上创建“district”select元素。re:separate EntityManager,这在您的情况下可能没有意义,但对于我的项目,在进行编辑时,将所有实体序列化/反序列化到localStorage或从localStorage中序列化是没有意义的。在我的例子中,我对我想要编辑的一组实体使用一个EntityManager——工作单元样式。在我的例子中,用户可以选择几个消费者进行离线处理。每个消费者与他们的电话、地址等一起单独缓存。我想在将大量实体加载到单个EntityManager时,您可能会遇到性能问题/内存压力,因为breeze需要进行所有处理来连接所有关系、跟踪实体。我不认为EntityManager打算以这种方式使用,我认为实体管理器更常见的做法是跟踪在特定屏幕上编辑的实体子集。谢谢。根据你所说的,我仍然不确定这一切是如何结合在一起的。假设我有一个有账单和付款的客户。那个
var query = breeze.EntityQuery
                .from("Countries")
                .orderBy("Name")
                .expand("Regions.Districts.Seasons, Regions.Districts.Sites");
var qry = breeze.EntityQuery
                    .from("SeasonClients")
                    .expand("Client,Group.Site,Season,VSeasonClientCredit")
                    .orderBy("DistrictId,SeasonId,GroupId,ClientId")

    var p = breeze.Predicate("District.Region.CountryId", "==", CountryId);
    var p1 = breeze.Predicate("SeasonId", "==", SeasonId);
    var p2 = breeze.Predicate("DistrictId", "==", DistrictId);
    var p3 = breeze.Predicate("Group.Site.SiteId", "in", SiteIds);
var qry = breeze.EntityQuery
                    .from("Repayments")
                    .orderBy('SeasonId,ClientId,RepaymentDate');

    var p1 = breeze.Predicate("District.Region.CountryId", "==", CountryId);
    var p2 = breeze.Predicate("SeasonId", "==", SeasonId);
    var p3 = breeze.Predicate("DistrictId", "==", DistrictId);
    var p4 = breeze.Predicate("SiteId", "in", SiteIds);