情况
我有大约 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 位)修复
这在内存方面有效,但速度非常慢。我怎样才能加快速度?
想法
对工作线程进行分区参数(有效,但受可用内存限制)
- 工作人员如何分担相同的工作量,而无需每个人都持有一份副本?
- 内存数据库(Redis、memcached)内存效率高,但由于 key 数量过多或序列化/反序列化较大的 JSON-blob,速度较慢
- node-mmap(将 JSON 存储为缓冲区,通过 mmap 共享缓冲区,解析 JSON 仍然需要太多时间)
- 工作人员如何分担相同的工作量,而无需每个人都持有一份副本?
为 worker 分配时间
- 不可行,因为工作人员被设计为在完整的时间内工作
仅将部分对象保留在内存中,并在需要时从磁盘重新加载(速度慢,但内存效率高)
TLDR
如何在 node.js 进程之间共享巨大的只读 JavaScript 哈希对象而不增加内存占用?
更新、想法 2.0
- 编写 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/