有没有什么解决方案可以让我用Node.js将这么多字符处理成一个字符串

Is there any solution that will allow me to process this many characters into a string with Node.js?

本文关键字:处理 字符 字符串 一个 解决方案 什么 js Node 有没有      更新时间:2023-09-26

我的问题:

有什么解决方案可以让我用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分配失败-进程内存不足中止


我不想下载更多的RAM,只是想找到一种方法来处理这个计算过程,而不是填满内存分配。

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

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

随时通知我!您可以tail -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'));

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