Javascript 是否有任何解决方案允许我使用Node.js将这么多字符处理成字符串?

Javascript 是否有任何解决方案允许我使用Node.js将这么多字符处理成字符串?,javascript,node.js,out-of-memory,Javascript,Node.js,Out Of Memory,我的问题: 是否有任何解决方案允许我使用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'

我的问题:

是否有任何解决方案允许我使用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!");
    }
}); 
问题是Node无法同时处理所有这些问题

致命错误:JS分配失败-内存不足进程中止

我不想,只是想寻找一种方法来处理这个计算过程,而不是填满内存分配

由于我喜欢使用这些天,我想我应该在这里发布一个解决方案作为练习,我认为应该将内存扩展到许多组合。这可能对你来说太慢了,我不知道,因为你想要生成的是37^16个组合,这太多了

此解决方案将创建一个包含所有解决方案的文件,并在5个字符的情况下用新行分隔。也许你可以试试,看看它是否适合你。转到16个字符的情况下,只需要添加新的flatMap调用

随时通知我!您可以跟踪-f文件以查看其增长

var fs = require('fs');
var _ = require('highland');

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 suffixer = function(alphabet) {
  var len = alphabet.length;
  return function(prefix) {
    var i = 0;
    return _(function(push, next) {
      if (i == len) {
        push(null, _.nil);
      } else {
        push(null, prefix + alphabet[i]);
        i++;
      }
      next();
    })
  }
}

var s = _(['\n'])
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))

s.pipe(fs.createWriteStream('alpha.txt'));

现在,为什么要生成这么多组合是另一个问题

也许您需要通过V8引擎增加NodeJS使用的堆大小?它们来自不久前,但这里有一个和一个。内存不足问题何时发生?如果可以成功创建结果数组,则可以创建一个可写流并将其分块输出到文件中。如果你不能制作完整的数组,那就有点棘手了。@apsillers说得对。我将用这些信息更新我的问题。@ajp15243堆大小的增加可能不会覆盖16位数的组合,这个错误只发生在其中的5个组合上。您做了太多的工作,无法得到比最大值更短的组合。如果您有所有5个字符组合,您可以简单地从每个字符中切掉一个字符,得到每个可能的4个字符组合。当然,你会有重复的,但根据顺序,你可能只需要计算4char组合的数量,从5char集合中取出那么多,然后将它们全部切成一片,就可以得到你所有的4char组合。现在运行这个测试。首先感谢您的帮助和对高地的介绍。是的,这非常有效。我正在研究highland库以修改并获得速度/剩余时间反馈,但这是一个完美的解决方案。它可能会牺牲一些速度,但它可以处理任何大小随着时间的推移,这正是我所寻找的。
var fs = require('fs');
var _ = require('highland');

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 suffixer = function(alphabet) {
  var len = alphabet.length;
  return function(prefix) {
    var i = 0;
    return _(function(push, next) {
      if (i == len) {
        push(null, _.nil);
      } else {
        push(null, prefix + alphabet[i]);
        i++;
      }
      next();
    })
  }
}

var s = _(['\n'])
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))
        .flatMap(suffixer(legalChars))

s.pipe(fs.createWriteStream('alpha.txt'));