2016-07-25 64 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對象中是絕對沒有問題的。因此,每當你想要獲取這些值時重讀它是非常不必要的。

所以你的解決方案應該是:加載一次,藉助數組索引(不要迭代數組)讀取多次。