【问题标题】:Is there any solution that will allow me to process this many characters into a string with Node.js?是否有任何解决方案可以让我使用 Node.js 将这么多字符处理成字符串?
【发布时间】: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


【解决方案1】:

由于这些天我喜欢使用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'));

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

【讨论】:

  • 现在运行这个进行测试。首先感谢您的帮助和对高地的介绍。
  • 是的,这很好用。我正在研究高地图书馆以修改并获得速度/剩余时间反馈,但是是的,这是完美的解决方案。它可能会牺牲一些速度,但随着时间的推移它可以处理任何大小,而这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 2021-07-25
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多