您将如何在 FirefoxOS、Tizen 或任何其他移动纯 JS 解决方案中模拟内存映射文件?
该用例适用于移动浏览器,您需要大量无法放入 RAM 的数据,或者您不想为此浪费 RAM 并希望延迟加载它。
我唯一发现的是IndexedDB或者我能做些什么呢?有更好的技巧或 API 吗?
嗯,看起来Web SQL 数据库也可以是 Android、Tizen 或 iOS 上的解决方案。但是 Firefox 不支持它(?)
更新:我问是因为一些实验
您将如何在 FirefoxOS、Tizen 或任何其他移动纯 JS 解决方案中模拟内存映射文件?
该用例适用于移动浏览器,您需要大量无法放入 RAM 的数据,或者您不想为此浪费 RAM 并希望延迟加载它。
我唯一发现的是IndexedDB或者我能做些什么呢?有更好的技巧或 API 吗?
嗯,看起来Web SQL 数据库也可以是 Android、Tizen 或 iOS 上的解决方案。但是 Firefox 不支持它(?)
更新:我问是因为一些实验
首先,Web SQL 永远不会像规范中解释的那样被标准化,所以它应该只用于基于 WebKit/Blink 的浏览器。
这个问题中有一个很棒的离线存储选项概述,即使在该问题中考虑了地图图块,我认为它仍然与您的用例相关。
我相信您在使用 IndexedDB 获取图形数据方面走在了正确的轨道上。在高层次上,它是一个键值对异步对象存储(请参阅基本概念文档)。对于您的用例,您可以索引对象存储中的图形节点。例如,LevelGraph库将图形数据存储在 IndexedDB 中,尽管它是为语义 Web 三元组构建的。HeliosJS也值得一提,尽管它是一个内存图形数据库。
编辑: IndexedDB 的当前 API 是异步的。规范中起草了同步 API,只能在 web worker 中使用。不幸的是,目前没有引擎实现此功能。Gecko有一个待处理的补丁,但我没有找到 Blink 或 WebKit 的任何计划,所以现在它不是一个有意义的选择。
可以通过 Web API 访问原始文件。您可以使用XHR2将(本地)文件加载为二进制Blob。不幸的是,XHR2 主要是为流文件而不是随机访问而设计的,尽管您可以将数据拆分为多个文件并按需请求它们,但这可能会很慢。目前对文件的直接访问非常有限,FileList 和 createObjectURL主要用于直接文件用户输入(通过拖放或文件输入字段),FileSystem API最近被杀死,并且DeviceStorage是非标准和特权的(Firefox OS -具体的)。您还可以将文件存储在 IndexedDB 中,FileHandle API对此进行了描述. 但是,一旦您设法访问原始 File 对象,您就可以使用Blob.slice方法来加载文件块 - 有一个通过上传表单读取文件块的好例子。您可能还想查看jDataView库和朋友,它通过更高效的ArrayBuffer简化了二进制数据的处理。
编辑:至于同步 API,也可以考虑localStorage (又名 DOM 存储)。它也是一个键值存储,但比 IndexedDB 简单得多,也更有限:
一般来说,localStorage 是有用的 cookie 替代品,但它对于存储大量离线数据并不是很有用。
所以总结一下:
最后,您可以结合这两种方法,有两个选择:
在所有情况下,您都可以(应该)使用Web Workers在后台处理数据操作和计算。
无论如何,GraphHopper 看起来很棒,我们真的缺乏这样非平凡的 Firefox OS 离线应用程序,祝你好运!