【问题标题】:Frequent file reads vs accessing huge Array频繁的文件读取与访问巨大的数组
【发布时间】:2016-11-28 17:49:49
【问题描述】:

我有一个包含 40000 个单词的列表,我想根据客户端的请求使用 Javascript(node.js) 经常随机返回 20-40 个单词。每次从文件中读取它还是将它存储在一个数组中然后访问它会更好吗?

【问题讨论】:

    标签: javascript arrays node.js file


    【解决方案1】:

    您的问题未指定如果从文件中选择单词,它将如何随机选择单词。我会凭直觉给出答案。

    相对于计算机本地磁盘的 I/O 总是比访问内存上的数据慢。如果您的数据(字)具有平面排列(即具有 40000 个条目的简单数组),您可以将其加载到内存数组中并通过随机化您从数组中选择的索引来访问字。

    【讨论】:

      【解决方案2】:

      巨大的数组(∈ RAM):

      如果你有一个好的内存,在巨大的数组中加载你的文件行会更好。 只是,不要忘记在运行 Node.js 应用程序时增加 RAM 的使用。

      node --max_old_space_size=2000 index.js //#default is 512Mo
      

      然后,在加载文件的行到数组中:

      var JFile=require('jfile');
      var words=new JFile('words.txt');
      //--> words.lines // return an array of lines, then , you can handle it
       var between20_40= Math.floor(Math.random() * (40 - 20 + 1)) + 20;
       var randome_words=words.lines.sort().slice(0,between20_40) // will get n lines randomly (n between 20 & 40)
      

      访问文件(∈ HDD):

      如果您的 RAM 容量小而您担心,访问文件会更好:

      var spawn = require('child_process').spawn;
       var between20_40= Math.floor(Math.random() * (40 - 20 + 1)) + 20;
      var shellSyntaxCommand = `sort -R words.txt | head -n ${between20_40}`;
      var output=spawn('sh', ['-c', shellSyntaxCommand], { stdio: 'inherit' });
      

      结论:

      处理 RAM 中的东西比处理 HDD 中的东西要好得多。因此,如果您有良好的 RAM 容量,我们建议您使用第一个选项。

      【讨论】:

      • 谢谢。不知道 RAM 限制。还有Shell Command到底在做什么。
      • @Utsav:我可以解释为评论,但是,我建议添加新问题:标题:“使用 shell 从文件中随机选择 n 行”.. 这样,我会写一个明确的答案,而不是评论。 .不要忘记在此处引用该问题的 URL
      • 其实做了一点研究,想通了。不过谢谢。 :)
      【解决方案3】:

      在黑名单算法中有完全相同的用例。我发现将 40.000 个单词加载到 JS 对象中绝对没有问题。所以每次你想要获得这些值时都重新阅读它是非常不必要的。

      所以你的解决方案应该是:加载一次,借助数组索引读取多次(不要迭代数组)。

      【讨论】:

        【解决方案4】:

        访问数组中的单词更快更容易,因为您只需随机化索引并在该索引处提取,而从文件中读取随机单词则必须应用更繁琐的方法。但是从文件中读取取决于单词在文件中的显示方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          相关资源
          最近更新 更多