频繁的文件读取与访问巨大的数组

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

巨阵(∈RAM):

如果你有一个好的RAM,加载你的文件在巨大的arrays是更好的。 只是,不要忘记在运行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容量,我们推荐第一个选项。

你的问题是不清楚的,因为它没有指定如何从文件中select随机select单词。

我仍然会根据预感给出答案。

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

希望这是帮助。

在黑名单algorithm中有完全相同的用例。 我想通了,加载40.000字到JS对象是绝对没有问题的。 所以每当你想要得到这些值时重读它是非常不必要的。

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

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