【问题标题】:Shared memory between Isolates using IndexedDB使用 IndexedDB 在 Isolate 之间共享内存
【发布时间】:2014-02-15 03:11:39
【问题描述】:

我现在正在使用 Isolates,想知道使用 IndexedDB 在 Isolates 之间共享数据是否是一种很好的交流方式?具体来说,我希望一个 Isolate 能够写入它,然后告诉其他 Isolate 他们可以只读它。这些数据一旦被写入就会被认为是不变的并且相当大。我想这样做的主要原因是因为我不想将 6MB 地图发送到 3 个不同的 Isolate,因为它对程序有点密集。

【问题讨论】:

    标签: dart web-worker dart-isolates


    【解决方案1】:

    网络工作者允许您在工作者之间传递数组缓冲区而无需复制。但是,一旦您将数组缓冲区传递给另一个工作人员,原始工作人员将失去对其内容的访问权限。

    因此,您可以尝试将数据结构存储在数组缓冲区中以利用这一点。

    请参阅此mdn articlehtml5rocks

    所以对于 Dart,将数据存储在 ByteData 中,然后在通过 dartjs 编译时,不应该复制,而是转移。

    旁注:Mozilla 还在进行一些实验,以跨多个 Web Worker 共享对数组缓冲区的可变访问。这是为了允许 emscripten 将多线程 c 代码编译为 javascript。这种共享访问可能需要一段时间才能标准化并得到广泛实施。

    【讨论】:

    • 我还没有查看,但是如果引用丢失,我不能在不复制的情况下将相同的数据发送给多个网络工作者?
    • 正确。在不复制数据的情况下,不可能同时在多个 Web Worker 中使用数据。异步 indexedb api 不是工作人员可用的,基本上只是消息传递与存储在单个线程/隔离/工作人员中的数据,不知道为什么您将 indexedb 视为解决此问题的方法,因为它将有据我所知,同样的限制。
    • 我希望 readOnly 事务会导致向任何请求数据的对象发送单个引用。
    【解决方案2】:

    如果您想将数据存储在 IndexedDB 中,这很好。 如果您这样做只是为了优化通信,我认为这不是直接发送的改进。 序列化/反序列化通常是 CPU 最密集的部分。 使用 IndexedDB 额外向慢速磁盘写入一次并从慢速磁盘读取三次。

    【讨论】:

    • 您认为不会有缓存来提高性能吗?我的主要讽刺是,仅仅在网络工作者之间发送意味着程序必须在将大量数据(在我的情况下为 6MB 映射)发送到每个线程之前对其进行深度复制,而不是从同一个缓存引用中读取。跨度>
    • 没想到。我会对其进行基准测试,看看哪些表现更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多