javascript - 在node.js进程之间读取-共享巨大的哈希值

标签 javascript node.js concurrency process sharding

情况

我有大约 10.000.000 个时间键以及关联的 JSON 数据点。 我需要使用不同的参数多次(~10.000)对所有这些数据点执行 JavaScript 函数 fn(time,data[time],params)。

当前方法

我使用 npm 模块 hashtable将数据存储在 V8s VM 之外。

//PSEUDO-STRUCTURE

var params = [{...},{...},...];
var HashTable = require("hashtable");
var myBigObject = new HashTable();

var timeIndices = {};
for(...) {
   myBigObject.put(time,data);        //<-- many times
   timeIndices[time] = true;
}
indices = Object.keys(indices);
params.forEach(function(currentParams) {
   timeIndices.forEach(function(time) {
       var data = myBigObject.get(time);
       fn(time,data,currentParams);
   });
});

问题

我遇到了以下问题:

  • V8 无法存储所有 JSON 数据,-> 使用哈希表修复
  • V8 无法处理所有数据,因为内存不足,-> 使用 --max_old_space_size(64 位)修复

这在内存方面有效,但速度非常慢。我怎样才能加快速度?

想法

  1. 对工作线程进行分区参数(有效,但受可用内存限制)

    • 工作人员如何分担相同的工作量,而无需每个人都持有一份副本?
      • 内存数据库(Redis、memcached)内存效率高,但由于 key 数量过多或序列化/反序列化较大的 JSON-blob,速度较慢
      • node-mmap(将 JSON 存储为缓冲区,通过 mmap 共享缓冲区,解析 JSON 仍然需要太多时间)
  2. 为 worker 分配时间

    • 不可行,因为工作人员被设计为在完整的时间内工作
  3. 仅将部分对象保留在内存中,并在需要时从磁盘重新加载(速度慢,但内存效率高)

TLDR

如何在 node.js 进程之间共享巨大的只读 JavaScript 哈希对象而不增加内存占用?

更新、想法 2.0

  1. 编写 C++ 程序,将数据加载到内存中,使用嵌入式 V8 环境启动 C++ 工作程序。这是否允许我在同一内存上运行多个 V8 虚拟机?

最佳答案

我有类似的需求,并且同样没有找到我想要的包。所以我从“更新,想法2.0”段落和implemented a module.中得到了启发。

它在共享内存中维护哈希结构的单个副本(从文件映射),并允许同一机器上的多个 Node 进程进行只读查询。

它是用 C++ 编写的,并使用 Boost's unordered_map 作为哈希系统。

关于javascript - 在node.js进程之间读取-共享巨大的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423934/

相关文章:

javascript - 以编程方式触发 javascript/jquery 事件

node.js - 未知命令 'DEBUG:myapp'

java - ConcurrentLinkedQueue 上的迭代器不会迭代到下一个值

c# - C# 的 Actors 有什么好的实现吗?

javascript - 在聚合 mongodb 中按条件比较总到期日期与当前日期?

javascript - 引用错误: obj is not defined using webcomponents & polymer

javascript - array.sort 与 wallaby.js 的行为异常

javascript - 模块参数的 Node js module.exports

node.js - Mongodb tailable游标,CPU使用率高-nodejs + mongodb

c# - C#中的多个并发定期刷新操作