如何处理像sproutcore这样的大型数据集

时间:2010-06-14 08:03:18

标签: javascript ruby-on-rails

我真的没有任何实质性的代码可以在这里展示,实际上,这就是我写作的原因:我在http://demo.sproutcore.com/sample_controls/上查看了SproutCore演示,特别是Collection演示,并且对它的加载感到惊讶200,000条记录到页面很容易。我尝试使用Rails提供200,000条记录,并在一个完全空白的HTML页面中 <%@ projects.each do | p | %GT;  <%= p.title%> <%end%> 在我的m1530笔记本电脑上使用4gb ram和t7700 256gb ssd冻结浏览器几秒钟。

然而,sproutcore演示没有冻结,加载时间不到3秒。

您认为他们使用的一种技术是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

SproutCore用于在“无限”数据列表中平滑显示和滚动的技术与数据的来源几乎没有关系,几乎所有与特殊SproutCore视图类的集成有关SC.CollectionViewSC.ListViewSC.GridView)和SC.ScrollView的父类;强大的客户端数据存储类集合:SC.StoreSC.SparseArray;以及SproutCore运行时和控制器架构。

事实是,你根本无法呈现其中的数十万个项目的列表,并期望浏览器不会停止。这是要插入到DOM树中的元素太多,这就是SC.CollectionView被优化为仅为列表中当前显示的项目生成元素的原因(例如,如果只有20个项目可见在2000万中,DOM中只有20个元素。它甚至比这更好,因为默认情况下,当项目滚入和滚出视图时,少数现有元素使用新项目信息进行更新,以便甚至不触及DOM树。虽然没有SC.ScrollView的集成允许集合知道它的可见rect以及滚动即将发生时,但这是不可能的。

除此之外,还有整个SproutCore运行时体系结构,用于确保所有DOM操作都排队等待,以便仅在需要时每个运行循环触摸一次属性更改(例如,在一个运行循环中切换显示属性50次,仅使用最终值触摸DOM一次)。这是影响所有SproutCore视图的极端性能的重要因素,包括SC.CollectionView

最后,为了使列表真正尖叫,你不能在一个请求中将数百万个项目加载到客户端,甚至也不能将它们全部存储在客户端内存中。这导致我对SC.CollectionView和SproutCore数据存储的另一个优化,即使用稀疏数据SC.CollectionView永远不会尝试迭代其内容中的每个项目,因此它不需要存在的所有数据,只需要显示的内容。当我们将数据加载到客户端时,我们会根据需要使用SC.SparseArray一次分页一些数据。整个系统设计得非常优雅,以便当集合视图请求稀疏数组尚不具有的项时,稀疏数组在后台获取它(或下一页项)。由于绑定和观察者,当新数据进入时,我们可以就地更新列表,这意味着滚动不会阻止数据进入

上面的演示已经过时,这是一个使用我上面提到的技术的新演示:http://showcase.sproutcore.com/#demos/Big%20Data(来源在这里:https://github.com/sproutcore/demos/tree/master/apps/big_data)。在本演示中,我滚动浏览 50,000个名称,这是我可以生成的所有内容,并分成500个JSON文件,每个文件有100个名称,每个文件都是从服务器远程加载的。滚动超过100个名称后,您将看到接下来的100个名称被分页,并且短暂闪烁的占位符文本“...”(您看到占位符文本需要多长时间取决于您的Internet连接)。

我使用了50,000个名字,但我看不到任何显示500,000或500万个名字的列表的问题。但是,在这种规模下,您还希望在使用SC.Store#unloadRecords引入新数据时“取消页面”数据,以减少内存耗尽。

还有一些其他技术可以让我错过这一切,但至少这些是主要的。

答案 1 :(得分:0)

更多关于sproutcore的信息.. http://ostatic.com/blog/sproutcore-raises-the-bar-for-client-side-programming

另一方面,如果您正在寻找并发性,那么node.js就是您的选择。

答案 2 :(得分:0)

我认为提供的演示不是动态生成的 - 它是静态数据。

很少有系统能够迭代大小的实时数据集合。有许多技术包括将数据集(使用批量迭代通过记录)流式传输到缓存和ajax部分加载策略。