8

您将如何在 FirefoxOS、Tizen 或任何其他移动纯 JS 解决方案中模拟内存映射文件?

该用例适用于移动浏览器,您需要大量无法放入 RAM 的数据,或者您不想为此浪费 RAM 并希望延迟加载它。

我唯一发现的是IndexedDB或者我能做些什么呢?有更好的技巧或 API 吗?

嗯,看起来Web SQL 数据库也可以是 Android、Tizen 或 iOS 上的解决方案。但是 Firefox 不支持它(?)

更新:我问是因为一些实验

4

1 回答 1

3

首先,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 简单得多,也更有限:

  • 存储空间有限,通常为 5 MB
  • 每个域/应用程序只有一个 localStorage(您可以在 IndexedDB 中拥有多个命名对象存储)。
  • 只能存储字符串。

一般来说,localStorage 是有用的 cookie 替代品,但它对于存储大量离线数据并不是很有用。


所以总结一下:

  • IndexedDB 是最简单且广泛可用的选项,尽管它可能会很慢、效率低下或在数据量很大时会达到内存限制;此外,目前只有异步 API 是可能的。
  • 如果没有用户交互,很难获得原始文件访问权限,并且 API 不稳定且不标准。

最后,您可以结合这两种方法,有两个选择:

  • 使用XHR2分块解析大文件,将解析后的节点存入IndexedDB
  • 将大文件存储到 IndexedDB(通过 XHR),使用FileHandle.getFile加载 File 对象并使用 Blob.slice读取其内容。

在所有情况下,您都可以(应该)使用Web Workers在后台处理数据操作和计算。

无论如何,GraphHopper 看起来很棒,我们真的缺乏这样非平凡的 Firefox OS 离线应用程序,祝你好运!

于 2014-05-21T17:58:41.017 回答