FirefoxOS的内存映射等价物

Kar*_*ell 8 javascript html5 gaia tizen firefox-os

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

用例适用于移动浏览器,您需要大量不适合RAM的数据,或者您不想浪费RAM而宁愿加载它.

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

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

更新:因为一些实验,我在问

jnv*_*jnv 3

首先,Web SQL 永远不会按照规范中的说明进行标准化,因此仅应考虑将其用于基于 WebKit/Blink 的浏览器。

\n\n

这个问题中有一个关于离线存储选项的精彩概述,即使该问题中考虑了地图图块,我认为它仍然与您的用例相关。

\n\n

我相信您使用 IndexedDB 处理图形数据的方向是正确的。从较高的层面来看,它是一个键值异步对象存储(请参阅基本概念文档)。对于您的用例,您可以在对象存储中索引图形节点。例如,LevelGraph库将图形数据存储在 IndexedDB 中,尽管它是为语义 Web 三元组构建的。HeliosJS也值得一提,尽管它是一个内存图形数据库。

\n\n

编辑: IndexedDB 的当前 API 是异步的。规范中起草了同步 API,只能在 Web Worker 中使用。不幸的是,目前没有引擎实现此功能。Gecko有一个待处理的补丁,但我没有找到 Blink 或 WebKit 的任何计划,所以它现在不是一个有意义的选择。

\n\n

可以通过 Web API 访问原始文件。您可以使用XHR2将(本地)文件作为二进制Blob加载。不幸的是,XHR2 主要是为流式文件而不是随机访问而设计的,尽管您可以将数据拆分为多个文件并按需请求它们,但这可能会很慢。\n对文件的直接访问目前相当有限,FileList和 createObjectURL主要用于直接文件用户输入(通过拖放或文件输入字段),FileSystem API最近已被终止,并且DeviceStorage是非标准且特权的(特定于 Firefox OS)。您还可以将文件存储在 IndexedDB 中,这在FileHandle API中进行了描述。但是,一旦您设法访问原始 File 对象,您就可以使用Blob.slice方法加载文件 \xe2\x80\x93 的块,这里有一个通过上传表单读取文件块的很好的示例。\n您可以还想看看jDataView库和朋友,它通过更高效的ArrayBuffer简化了二进制数据的处理。

\n\n

编辑:对于同步API,也可以考虑localStorage (又名DOM存储)。它也是一种键值存储,但比 IndexedDB 简单得多,也受到更多限制:

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

总的来说,localStorage 是有用的 cookies 替代品,但对于存储大量离线数据来说并不是真正有用。

\n\n
\n\n

总结一下:

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

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

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

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

\n\n

不管怎样,GraphHopper 看起来很棒,我们真的缺乏这种重要的 Firefox OS 离线应用程序,祝你好运!

\n