有没有办法在Node.JS中的worker/threads/something之间共享内存?

Nei*_*ilK 18 parallel-processing multithreading fork node.js

我有一个Node应用程序,它访问静态的,大型(> 100M),复杂的内存数据结构,接受查询,然后通过HTTP向客户端提供一小部分数据.

大多数查询都可以在十分之一秒内得到解答.Hurray for Node!

但是,对于某些查询,搜索此数据结构需要几秒钟.这很糟糕,因为其他人都要等.

为了有效地为更多客户服务,我想使用某种并行性.

但是,因为这个数据结构太大了,我想在工作者或线程中分享它或者你有什么,所以我不会烧掉数百兆字节.这将是非常安全的,因为数据结构不会被写入.任何其他语言的典型'fork()'都可以.

但是,据我所知,在Node中进行并行化的所有标准方法都明确地使这变得不可能.为安全起见,他们不希望您分享任何东西.

但有办法吗?

背景:

将此数据结构放在数据库中,或使用memcached或类似的东西是不切实际的.

WebWorker API库和类似的只允许将短序列化消息传入和传出工作者.

Node的Cluster使用名为'fork'的调用,但它实际上不是现有进程的分支,而是生成一个新进程.所以再一次,没有共享内存.

可能真正正确的答案是使用类似文件系统的共享内存,即tmpfs或mmap.有一些节点库使mount()和mmap()可用于这样的事情.不幸的是,必须在同步搜索和读取之上实现复杂的数据结构访问.我的应用程序使用dicts数组的数组,依此类推.没有必要重新实现这一切将是很好的.

sup*_*ipd 5

我尝试从nodejs编写共享内存访问的C/C++绑定.https://github.com/supipd/node-shm

仍在进行中(但为我工作),也许有用,如果错误或建议,通知我.


Pas*_*cle 0

使用 WAF 构建是旧式(节点 0.6 及以下),新构建是使用 gyp。

您应该查看节点集群(http://nodejs.org/api/cluster.html)。如果没有更多细节,不清楚这是否会对您有所帮助,但这使用 fork 在同一台机器上运行多个节点进程。

  • 就在您链接到的条目中:“这些子节点仍然是 V8 的全新实例。假设每个新节点至少有 30 毫秒启动时间和 10 MB 内存。也就是说,您无法创建数千个子节点。” 就我而言,我必须将 >100MB 加载到每个文件中。 (2认同)