2016-07-25 63 views
1

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

+0

好主题..我的回答如下。 –

回答

1

巨大的数组(∈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) 

Access文件(∈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' }); 

结论:

处理的内存RAMHDD要好得多。因此,如果你有一个好的RAM容量,我们推荐第一个选项。

+0

谢谢。不知道内存限制。壳命令也是如此。 – URS

+0

@Utsav:我可以解释为评论,但是,我建议添加新的问题:标题:“从文件随机使用shell中选择n行”..由此,我会写一个明确的答案,而不是评论。 。不要忘记在这里提及该问题的网址 –

+1

实际上做了一些研究并找出了答案。不过谢谢。 :) – URS

4

你的问题并不清楚,因为它没有指定如何从文件中挑选单词。

我仍然会给出一个基于hunch的答案。

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

希望这有帮助。

0

从数组中访问单词要快得多,因为您只需随机化索引并在该索引处进行提取,同时从文件中读取随机单词即可使用更繁琐的方法。但是从文件读取取决于单词在文件中的显示方式。

1

在黑名单算法中有完全相同的用例。我发现将一个40.000字加载到一个JS对象中是绝对没有问题的。因此,每当你想要获取这些值时重读它是非常不必要的。

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