gpt4 book ai didi

javascript - 节点脚本内存不足(循环内循环)

转载 作者:行者123 更新时间:2023-11-28 17:51:53 24 4
gpt4 key购买 nike

我有一个非常基本的脚本,我一直在一点一点地添加功能 - 几乎没有优化。

它应该遍历 X 个品牌并为每个品牌运行 API 调用(每个品牌都有一个唯一的端点),然后将结果保存到 CSV。

CSV 部分运行良好,尽管有点慢。 (200KB 文件大约需要 20 秒)。

但是,当我将所有内容包装在 brands 的循环中时,它现在超时了。默认情况下它会运行 2 分钟然后给我一个错误 fatal error :CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足

我学会了附加 --max_old_space_size=4000000 来给它多余的内存(它也在 2GB 时死掉了)。在 4GB 时,我没有收到错误,但收到了 Windows 内存泄漏警告,因此很明显我的脚本存在问题。我感觉它在循环中循环,但不确定。

var http = require("https");
var qs = require("querystring");
var csvWriter = require('csv-write-stream');
var fs = require('fs');
var moment = require('moment');
let key = '';
var brands = ['REDACTED1','REDACTED2','REDACTED3','REDACTED4','REDACTED5','REDACTED6','REDACTED7','REDACTED8']
var dataRequest = function(token){
var date = new Date()-1; //Make it yesterday
var formattedDate = moment(date).format('YYYYMMDD');
var yesterdayDashes = moment(date).format('YYYY-MM-DD');
for (var k=0;k<=brands.length;k++){

var headers = [];
var csvBody = [];
var csvContent = "data:text/csv;charset=utf-8,";
var options = {
"method": "GET",
"hostname": "REDACTED",
"port": "443",
"path": "REDACTED/"+brands[k]+"/"+yesterdayDashes+"?REDACTED&access_token="+token,
"headers": {
"authentication": "Bearer "+token,
"content-type": "application/json",
"cache-control": "no-cache"
}
}

var req = http.request(options, function (res) {
var chunks = [];

res.on("data", function (chunk) {
chunks.push(chunk);
});

res.on("end", function () {
var body = Buffer.concat(chunks);
var object = JSON.parse(body);
var writer = csvWriter({
headers: ["REDACTED1", "REDACTED2", "REDACTED3", "REDACTED4", "REDACTED5", "REDACTED6", "REDACTED7", "REDACTED8", "REDACTED9"]
})
writer.pipe(fs.createWriteStream(brands[k] +'_' +formattedDate +'_DEMOGRAPHIC.csv'))
for (var i=0;i<object.length; i++){
writer.write([
object[i].field1.REDACTED1,
moment(object[i].optin.REDACTED2).format('YYYYMMDD HHMMSS'),
object[i].field2.REDACTED1,
object[i].field2.REDACTED2,
object[i].field2.REDACTED3,
object[i].field2.REDACTED4,
object[i].field2.REDACTED5,
object[i].field3.REDACTED6,
object[i].field3.REDACTED7
])
}
writer.end()
});
});
req.end();
}
}

var authToken = function(){

var form = qs.stringify({
grant_type: 'client_credentials',
client_credentials: 'client_id:client_secret',
client_id: 'cdg-trusted-client',
client_secret: 'REDACTED'
})
var options = {
"method": "POST",
"hostname": "REDACTED3",
"port": null,
"path": "REDACTED3",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"cache-control": "no-cache"
}
};

var req = http.request(options, function (res) {
var chunks = [];

res.on("data", function (chunk) {
chunks.push(chunk);
});

res.on("end", function () {
var body = Buffer.concat(chunks);
var json = JSON.parse(body);
key = json['access_token'];
});
});

req.write(form);
req.end();
dataRequest(key);
}
authToken();

我删除了敏感信息,但所有逻辑仍然存在。这是我快速拼凑起来的脚本,但老实说,通过它,我真的看不出有任何理由它需要这么多内存。我认为这可能是无限循环,但直接测试节点内的每个循环我没有任何问题。

流程开始获取不记名 token 一次,然后将其传递给函数以提取数据。

虽然我正在讨论是否将其放入 CodeReview,但该代码技术上根本无法工作。

更新现在,修改第一个 for 循环会立即输出一个未识别 CSV,并且不会输出任何其他内容。但是 console.log(brands[k]) 正在输出适当的文件。

更新2

我的 JS 调试版本将 console.log() 放在任何地方,我注意到一旦我低于 http.request init,brands[k] 就会突然变成不明确的。我认为这可能是因为它没有传递到函数中?

更新3

我的未定义问题是由缺少分号引起的,提前结束了for循环。我已经纠正了它,但现在我又遇到了最大堆栈跟踪问题。

我的问题上下文现在似乎是“如何使这个 for 不运行异步?”

最佳答案

这是你的问题: for (var k=0;k=brands.length;k++){您已使用运算符=这是赋值运算符,将品牌的长度放入变量 k而不是 <检查是否 k 的运算符仍然小于 brands.length .

发生的情况是,循环中测试的表达式是数字 8(品牌数组的长度),并且它始终保持为 8,因此您将进入无限循环。

请注意,对于 bool 表达式,任何不同于 0 的值表示值 true 而 0代表错误。

这是关于无限循环问题,还要注意您的代码在将 token 传递给 dataRequest 时存在另一个问题。功能。

问题是你试图在 req.end(); 之后立即传递它;发送请求。

此时还没有响应,回调函数res.on("end", ...仍然没有执行。基本上,您将 undefined 传递给 dataRequest 函数,这会导致第二个错误。只需将调用移至 dataRequest发生在end内像这样回调:

res.on("end", function () {
var body = Buffer.concat(chunks);
var json = JSON.parse(body);
key = json['access_token'];
dataRequest(key);
});

关于javascript - 节点脚本内存不足(循环内循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45337444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com