我真的没有什么实质性的代码可以在这里展示,实际上,这就是为什么我要写:我看了http://demo.sproutcore.com/sample_controls/上的SproutCore演示,特别是集合演示,我很惊讶它能如此轻松地将200,000条记录加载到页面。我尝试使用Rails提供200,000条记录,并在一个完全空白的HTML页面中使用<% @projects.each do |p| %> <%= p.title %> <% end %>,它在我的m1530笔记本电脑上冻结了几秒钟,内存为4 4gb,固态硬盘为256 4gb。
然而,sproutcore演示不会冻结,并且只需不到3秒的时间来加载。
你认为他们用来实现这一点的技术是什么?
谢谢!
发布于 2010-06-14 19:11:56
我想提供的demo不是动态生成的--它是静态数据。
很少有系统能够迭代这种大小的实时数据集合。有许多技术,包括流式传输数据集(使用批处理迭代遍历记录)到缓存和ajax部分加载策略。
发布于 2013-05-24 00:28:24
SproutCore用来在“无限”数据列表中平滑地显示和滚动的技术与数据的来源几乎没有关系,而几乎全部与特殊的SproutCore视图类、SC.CollectionView ( SC.ListView和SC.GridView的父类)和SC.ScrollView的集成有关;强大的客户端数据存储库类的集合:SC.Store和SC.SparseArray;以及SproutCore运行时和控制器体系结构。
事实是,您不能简单地呈现一个包含数十万个项目的列表,并期望浏览器不会停止工作。插入到DOM树中的元素太多了,这就是为什么SC.CollectionView被优化为只为列表中当前显示的项生成元素(例如,.如果2000万个项目中只有20个可见,则DOM中只有20个元素)。不过,它甚至比这更好,因为在默认情况下,当项目滚动进和滚动出视图时,少数现有元素会用新的项目信息在适当的位置更新,因此DOM树甚至不会被触动。然而,如果没有SC.ScrollView的集成,这是不可能的,因为它允许集合知道它的可视矩形以及滚动即将发生的时间。
最重要的是,有一个完整的SproutCore运行时体系结构,它用于确保所有的DOM操作都排入队列,以便在显示属性发生变化(例如,.在一个运行循环中切换显示属性50次,只会使用最终值触及DOM一次)。这是影响包括SC.CollectionView在内的所有SproutCore视图的极端性能的一个重要因素。
最后,要使列表真正尖叫,您不能在一个请求中将几百万个项目加载到客户端,甚至不能将它们全部存储在客户端内存中。这就引出了对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引入新数据以降低内存使用量时,您可能还希望对数据进行“取消分页”。
还有一些其他的技术可以使我错过的整个事情成为可能,但这些至少是主要的。
发布于 2010-06-14 18:59:01
更多关于sproutcore的信息..http://ostatic.com/blog/sproutcore-raises-the-bar-for-client-side-programming
另一方面,如果您正在寻找并发性,那么node.js就是最佳选择。
https://stackoverflow.com/questions/3035754
复制相似问题