如何在单页应用中管理大量已过滤,已排序,分页的数据,这些应用也必须在资源有限的设备上运行(例如,移动设备)?
更具体地说;我有一个1000多个地理编码的地方信息对象的数据集,它被过滤到地图视口中包含的数据集。由于移动设备的内存限制,我无法缓存整个数据集。但是,由于移动设备上的网络连接速度较慢,我希望最小化HTTP请求。
最大缓存和最小网络请求组合的最佳策略是什么?
我正在为澳大利亚潜在的大型(1000+)信息数据集构建地图分割视图:
+----------------------------------------+-----------------------------+
| | +----------+ |
| | Sort By: |Suburb |\/| |
| | +----------+ |
| |+---------------------------+|
| _,__ .: || ||
| <* / | \ || Blah Blah ||
| .-./ |. : :, || ||
| / '-._/ \_ || Zoom Zip ||
| / ' \ || ||
| .' *: |+---------------------------+|
| .-' ; |+---------------------------+|
| | | || ||
| \ / || Bing Bong ||
| | / || ||
| \* __.--._ / || Banana for scale ||
| \ _.' \:. | || ||
| >__,-' \_/*_.-' |+---------------------------+|
| |+---------------------------+|
| :--, || ||
| '/ || Whoopty Doo ||
| || ||
+----------------------------------------+-----------------------------+
驾驶要求是:
我经历了几次迭代处理app *中的数据:
由于列表中的每个项目可能包含大量数据(采用JSON格式),因此移动设备上的内存限制会出现问题。
在一次加载整个列表时,还有其他考虑因素会重载DOM(浏览器中的渲染时间使应用程序无法使用)。
这样做&#34;页面&#34;在一个时间(一个页面约30项),我们解决了初始内存需求,但滚动到目前为止,我们再次在移动设备上达到了极限。
现在手机上还有一个网络要求 - 遗憾的是,GPRS / EDGE速度在澳大利亚仍然很常见,而且非常糟糕。
可以使用空占位符替换旧DOM元素(以保持滚动的可供性),并且可以从内存中删除列表中的关联项。这解决了DOM限制问题。
但是,如果用户向上滚动列表,我们现在已经加倍了网络负载。即;没有缓存的数据了。
所以我们的缓存现在可以保持温暖,滚动回来应该是一个没有网络请求的即时加载。
但是如果用户改变过滤器/分类标准怎么办?单个缓存不再有效,因为列表中的结果可能需要重新过滤并重新排序才能显示。
由于数据集是延迟加载的,因此应用程序没有完整的数据集来正确执行过滤和排序,因此需要HTTP请求。
最糟糕的情况是用户稍微平移地图。 1-2个项目可能会从一侧掉落,而2-3可能会在另一侧添加。现在,我们不是重新使用任何可能缓存的数据,而是通过网络请求不必要地重新加载。
id
列表,只接收结果的增量 这样可以节省通过网络下载的数据。但是,可能会导致大量数据 up 发送,因此API可以执行增量。
范围可以是可见边界框的子集(想想空间分区),也可以是&#34;页面&#34;滚动等时的30个结果
这解决了网络流量过大(上下)的问题,但我担心存储已知范围所需的元数据也可能达到移动设备的内存限制。
通过删除此要求,我们可以将显示的结果限制为最大值,例如50-100,并且当我们在设备上运行时,坚持使用迭代1(朴素)方法检测到能力有限。
如何在单页应用中管理大量已过滤,已排序,分页的数据,这些应用也必须在资源有限的设备上运行(例如,移动设备)?
* 注意:我已经使用基于当前缩放级别的聚类技术找出了地图上数据的渲染,所以这不是问题
答案 0 :(得分:1)
您最好的选择是以非常不同的方式实施它。我通常做的是采用分层方法。在你的情况下,也许你应该有一个按州,然后是城市等的第一个聚合层。这样你就不会一次加载数百个数据点,顺便说一句,这不是你的用户想要的:他们&#39;通常需要寻找特定或聚合数据的东西 - 但从不寻找成千上万的结果来手动浏览。