javascript - 将 JSON 对象乘以数组以创建大于 1M 记录的更大产品 json 时如何最大化 NodeJS 性能
问题描述
下面,我正在寻找有关如何处理将 json 对象中的 2 个字段与数组中的所有项交叉相乘以创建比数百万条记录更大的数据集的建议。NodeJS(V8 引擎)可以处理的内容是否存在硬性限制以及如何量化?
在我尝试使用为我的 Stackoverflow 问题提供的Excel 解决方案中非常有用的 VBA来执行来自 2 个单独选项卡的行乘法时,在处理约 42K 千行数据 x 9 行时遇到了瓶颈问题,导致超过 374085由 VBA 动态生成的行。Excel 中的 VBA 可以工作,但处理速度比预期的要慢(完成时间从 30 分钟到一个小时不等)。
当我转向使用 Chrome V8 引擎的 NodeJS 来执行相同的过程时。在将 csv 文件初始转换为 json (sample.json) 后,它在 4 秒内执行(包括将 json 转换为 csv 文件)。我将在下面发布我的代码,但请记住它只有 41565 x 9 => 374085 记录 json/csv 文件。
首先安装 npm 模块“fast-csv”。
perform_multiplication_of_JSON_with_arrayObject.js
var fs = require('fs');
var fastcsv = require('fast-csv');
var fileName = "sample.json";
var fileContent = fs.readFileSync("" + fileName + "", "utf8");
var sample = JSON.parse(fileContent);
var options = ['SERVICE','NEW_WATER','NEW_COFFEE','NEW_FILTRATION','WEB_SITE','MEDIA_INQUIRY','DONATIONS','RD_INQUIRY','OTHER'];
var newSample = [];
for(var i = 0;i< sample.length;i++) {
for (var x= 0;x < options.length;x++) {
var counter = i*x;
newSample.push({"id": i,
"Email Address": sample[i]["Email Address"],
"Zipcode": sample[i]["Zipcode"],
"City": sample[i]["City"],
"State": sample[i]["State"],
"Contact Regarding": options[x]});
}
}
console.log(newSample);
//write file to a csv
fastcsv.writeToPath("csvoutput/newsample.csv", newSample, {headers: true})
.on("finish", function(){
console.log("newsample.csv file writing done!");
});
sample.json(为简洁起见,我包括 3 条记录,但实际上是 41565 条记录)
[ {“id”:1,“电子邮件地址”:“newyork@ourcompany.com”,“邮政编码”:501,“城市”:“Holtsville”,“州”:“NY”,“联系方式”:“” },{“id”:2,“电子邮件地址”:“newyork@ourcompany.com”,“邮政编码”:544,“城市”:“Holtsville”,“州”:“NY”,“联系方式”:“ " }, { "id": 3, "Email Address": "massachussetts@ourcompany.com", "Zipcode": 1001, "City": "Agawam", "State": "MA", "联系方式": "" } ]
如果/当我遇到需要执行相同想法的较大数据集的问题时,遇到 Javascript 内存堆错误之前的阈值是多少?我访问了Majestic Million 网站以获取更大的数据集,并尝试尝试并适当地更改代码以匹配该数据集中的字段。我很快发现,如果使用 1M 或 500M 之类的数据集,我无法在没有看到这些 Javascript 内存堆错误的情况下尝试跨 9 个项目的处理器样本类型。
谁能提供有关如何提高 NodeJS 内存性能的建议?如前所述,尝试跨越 1M 记录 x 9 和 500K 记录 x 9 都会给出此消息,该消息似乎在大约 10-15 秒的处理后显示。然而,当我在 250K 记录中砍掉这个庞大的百万文件并以 250K x 9 => 2.2M 结果记录重试时,脚本成功处理。很高兴知道如何绕过 JS 内存堆。是否可以通过简单的调整或模块来解决?
安全上下文:0x0384ce31e6e1 1: /* 匿名/(aka /匿名 */) [000002F7A4D02291] [C:\node-projects\www\lesson_arrays\node_modules@fast-csv\format\build\src\index.js:~42 ] [pc=0000024872377D81](this=0x02a2dba826f1 ,prev=0x03f9c7e416b9 ,row=0x037e777200c1 ) 2: 参数适配器框架: 4->2 3: re...
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 00007FF61D05ECF5 2: 00007FF61D0381A6 3: 00007FF61D038BB0 4: 00007FF61D2C9AAE 5: 00007FF61D2C99DF 6: 00007FF61D807724 7: 00007FF61D7FDE87 8: 00007FF61D7FC3FC 9: 00007FF61D805377 10: 00007FF61D8053F6 11: 00007FF61D3A84B7 12:00007FF61D44019A 13:00000248722DC5C1
解决方案
推荐阅读
- python - 在 Estimator SessionRunHook 中更改 tf.Variable 值
- javascript - JSON.parse无效字符与有效JSON?
- json - 在按钮单击时更改特定项目的值
- sql - 在 sql 中 PIVOT 下表
- javascript - 如何从 React.FormEvent 中检索表单值
? - android - 如何减小 android 本机共享库(.so 文件)的大小?
- java - 如何仅使用本地目录作为存储库在 gradle 上设置 springframework?
- python - Matplotlib df.plot() 显示点而不是线,即使指定
- mysql - 如何使用 mySQL 语法将 UNIQUE 字段添加到包含我的表的数据的现有表
- php - PHP CURL - 当你只知道 id 时抓取 seo url