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