【发布时间】:2014-11-13 05:30:37
【问题描述】:
我的问题:
是否有任何解决方案可以让我使用 Node.js 将这么多字符处理成字符串?
问题:
我需要在 Node.js 中计算一个巨大的(数组,然后)字符串,如下所示:
var fs = require('fs');
var legalChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', '_'];
var fiveChars = [legalChars,
legalChars,
legalChars,
legalChars,
legalChars];
//output all possible combinations of the arrays within
//fiveChars
function allPossibleCases(arr) {
if (arr.length === 0) {
return [];
} else if (arr.length === 1) {
return arr[0];
} else {
var result = [];
var allCasesOfRest = allPossibleCases(arr.slice(1));
// recur with the rest of array
for (var c in allCasesOfRest) {
for (var i = 0; i < arr[0].length; i++) {
result.push(arr[0][i] + allCasesOfRest[c]);
var val = arr[0][i] + allCasesOfRest[c];
}
}
return result;
}
}
// join array of results into string
var result = allPossibleCases(fiveChars).join('", "');
// this essentially writes the string in the form of a Node module
//containing a giant array
fs.writeFile("./data/fiveChars.js",
'fiveChar = ["' + result + '"]; \r\n module.exports = fiveChar;',
function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
我想继续添加最多 16 行的字符行:
var sixteenChars = [legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars, legalChars];
问题是 Node 不能一下子解决这个问题。
致命错误:JS 分配失败 - 进程内存不足中止
我不想download more RAM,只是寻找一种方法来随着时间的推移处理这个计算过程,而不是填满内存分配。
【问题讨论】:
-
也许您需要增加 NodeJS 使用的堆大小(通过 V8 引擎)?它们来自不久前,但这里有一个 related SO question 和一个 blog post。
-
内存不足问题什么时候发生?如果您可以成功创建
result数组,则可以创建可写流并将其分段输出到文件中。如果你不能制作完整的数组,那就有点棘手了。 -
@apsillers 好点。我将使用该信息更新我的问题。
-
@ajp15243 堆大小增加可能不会涵盖 16 位组合,只有五个组合会发生此错误
-
你做了太多的工作来获得短于最大值的组合。如果您拥有所有 5 个字符组合,您可以简单地从每个字符中切下一个字符以获得所有可能的 4 个字符组合。当然,您会有重复的,但根据顺序,您也许可以只计算 4char 组合的数量,从 5char 集中拉出那么多,然后将它们全部切下以获得所有 4char 组合。
标签: javascript node.js out-of-memory