FirefoxOS的内存映射等价物

时间:2014-04-25 14:45:08

标签: javascript html5 firefox-os tizen gaia

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

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

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

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

更新:我问的是some experiments

1 个答案:

答案 0 :(得分:3)

首先,Web SQL不会像the specification中所解释的那样标准化,因此只应考虑基于WebKit / Blink的浏览器。

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

我相信您使用IndexedDB处于图形数据的正确轨道上。在较高的层次上,它是一个键值异步对象存储(参见Basic Concepts document)。对于您的用例,您可以在object store中索引图形节点。例如,LevelGraph库存储了IndexedDB中的图形数据,尽管它是为语义Web三元组构建的。 HeliosJS也值得一提,尽管它是一个内存图数据库。

编辑: IndexedDB的当前API是异步的。规范中草拟了synchronous API,只能在网络工作者中使用。不幸的是,目前没有引擎实现此功能有一个pending patch for Gecko,但我没有找到Blink或WebKit的任何计划,因此它现在不是一个有意义的选项。

可以通过Web API访问原始文件。您可以使用XHR2将(本地)文件加载为二进制Blob。不幸的是,XHR2主要是为流文件而不是随机访问而设计的,尽管你可以将数据分成多个文件并按需请求它们,但这可能很慢。 目前对文件的直接访问非常有限,FileList and createObjectURL主要用于直接文件用户输入(通过拖放或文件输入字段),FileSystem API为recently killedDeviceStorage是非标准和特权(Firefox OS特定)。您还可以在IndexedDB中存储文件,该文件针对FileHandle API进行了描述。但是,一旦您设法访问原始File对象,就可以使用Blob.slice方法加载文件的块 - 有一个great example of reading file chunks via upload form。 您可能还想查看jDataView图书馆&朋友们,通过更高效的ArrayBuffer轻松处理二进制数据。

编辑:对于同步API,也可以考虑localStorage(也称为DOM存储)。它也是一个键值存储,但比IndexedDB更简单,更有限:

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

通常,localStorage是有用的cookie替代品,但它对存储大型离线数据并没有多大用处。


总结一下:

  • IndexedDB是最容易和最广泛使用的选项,尽管它可能很慢,效率低或者内存限制很大,数据非常大;另外,目前只能使用异步API。
  • 如果没有用户交互,很难获得原始文件访问,并且API不稳定且不标准。

最后,您可以将两种方法结合起来,记住两个选项:

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

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

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