【发布时间】:2016-11-28 17:49:49
【问题描述】:
我有一个包含 40000 个单词的列表,我想根据客户端的请求使用 Javascript(node.js) 经常随机返回 20-40 个单词。每次从文件中读取它还是将它存储在一个数组中然后访问它会更好吗?
【问题讨论】:
标签: javascript arrays node.js file
我有一个包含 40000 个单词的列表,我想根据客户端的请求使用 Javascript(node.js) 经常随机返回 20-40 个单词。每次从文件中读取它还是将它存储在一个数组中然后访问它会更好吗?
【问题讨论】:
标签: javascript arrays node.js file
您的问题未指定如果从文件中选择单词,它将如何随机选择单词。我会凭直觉给出答案。
相对于计算机本地磁盘的 I/O 总是比访问内存上的数据慢。如果您的数据(字)具有平面排列(即具有 40000 个条目的简单数组),您可以将其加载到内存数组中并通过随机化您从数组中选择的索引来访问字。
【讨论】:
如果你有一个好的内存,在巨大的数组中加载你的文件行会更好。 只是,不要忘记在运行 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)
如果您的 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 容量,我们建议您使用第一个选项。
【讨论】:
在黑名单算法中有完全相同的用例。我发现将 40.000 个单词加载到 JS 对象中绝对没有问题。所以每次你想要获得这些值时都重新阅读它是非常不必要的。
所以你的解决方案应该是:加载一次,借助数组索引读取多次(不要迭代数组)。
【讨论】:
访问数组中的单词更快更容易,因为您只需随机化索引并在该索引处提取,而从文件中读取随机单词则必须应用更繁琐的方法。但是从文件中读取取决于单词在文件中的显示方式。
【讨论】: