我有一个40000个单词的列表,我想根据客户端的请求,经常使用Javascript(node.js)随机返回20-40个单词。是每次从文件中读取它更好,还是在数组中存储一次然后访问它更好?
您的问题没有说明如果从文件中选择单词,它将如何随机选择。我会根据直觉给出答案。
相对于计算机本地磁盘的I/O总是比访问内存上的数据慢。如果你的数据(单词)有一个平面排列(即有40000个条目的简单数组),你可以将它加载到一个内存数组中,并通过随机化从数组中选择的索引来访问单词。
巨大数组(∈RAM):
如果你有一个好的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容量,我们建议您选择第一个选项。
在黑名单算法中有完全相同的用例。我发现将40.000个单词加载到JS对象中绝对没有问题。因此,每次你想得到这些值时重读它是非常没有必要的。
因此,您的解决方案应该是:加载一次,在数组索引的帮助下读取多次(不要迭代数组)。
从数组中访问单词要快得多,也更容易,因为您只需随机化索引并在该索引处提取,而从文件中读取随机单词则需要应用更繁琐的方法。但从文件中读取取决于单词在文件中的显示方式。