App下載
話題 首頁(yè) > JavaScript 教程 > JavaScript 教程話題列表 > 詳情

js百萬(wàn)條數(shù)據(jù)的排序

精華
onoD 2016-10-08 06:16:49 瀏覽(4595) 回復(fù)(3) 贊(0)

百萬(wàn)條數(shù)據(jù)的排序。語(yǔ)言是js,有個(gè)object,里面的東西很簡(jiǎn)單,就是 key=>value 格式而已

let keys = Object.keys(data);

光這一步我執(zhí)行就費(fèi)了一秒鐘的時(shí)間了。

循環(huán)一次,耗費(fèi)了1.5秒。

還有得搞嗎?我不知道人家那種一秒鐘不到,把數(shù)據(jù)排列并且搜索的怎么弄的,太神奇了。

-----------------補(bǔ)充----------------------

下面的回答關(guān)注點(diǎn)都在需求上面了。詳細(xì)說(shuō)一下。

1、首先是nodejs環(huán)境,不是真正的前端。這個(gè)我上面沒有說(shuō),但不影響解決問題。

2、下面的回答都角度都是什么先展示幾頁(yè)啥的,我沒說(shuō)展示百萬(wàn)條數(shù)據(jù),我只是排序,搜索。比如,我搜索 key=abc , 第 100條,列出 50個(gè)數(shù)據(jù),按照key排序列出, 你難道不是從這100萬(wàn)條數(shù)據(jù)去搜索、排序嗎?難道你要從前50條里面去操作嗎?

我操作100萬(wàn)條,我可沒說(shuō)展示100萬(wàn)條。。。這個(gè)得看清楚。

3、具體情況是這樣的。底層數(shù)據(jù)存儲(chǔ)使用leveldb,leveldb都是存儲(chǔ)在硬盤里面,單個(gè)key搜索還是挺快的。但是你要搞個(gè)排序、分頁(yè),他得把100萬(wàn)條數(shù)據(jù)從硬盤里面一個(gè)一個(gè)讀取,然后你再進(jìn)行操作。

按照他那樣,讀取完一次,估計(jì)4分鐘。從硬盤讀取,速度肯定很慢了,不過(guò)他也有好處,內(nèi)存占用小。不然你10G的東西,都一次性拿出來(lái)再操作,可想而知……

所以,解決的辦法,自己生成索引。把索引放到一個(gè)文件里面,查詢的時(shí)候一次性加載進(jìn)來(lái),放到內(nèi)存,這樣就比你把100萬(wàn)篇文章從硬盤一個(gè)一個(gè)找出來(lái)再排序高效很多。比如 id=>dateline 這樣的形式,保存id和時(shí)間,如果你想按照時(shí)間進(jìn)行排序,那么就可以對(duì)索引進(jìn)行排序,比如取出50個(gè)id出來(lái),然后再去硬盤讀取這50個(gè)就行了

因?yàn)樗饕募苄。皇潜4媪艘恍┖?jiǎn)單得不能再簡(jiǎn)單的數(shù)據(jù),所以百萬(wàn)條數(shù)據(jù),加起來(lái)不過(guò)幾十MB,這樣內(nèi)存占用也是很低的。

4、像這種情況,索引使用Redis存儲(chǔ)應(yīng)該是一個(gè)不錯(cuò)的解決方案,但環(huán)境不允許。環(huán)境允許的話,我使用mysql之類的存儲(chǔ)就好了。

javascript

回答(3)

一筆荒蕪 2018-05-31

剛學(xué)習(xí)程序,過(guò)來(lái)學(xué)習(xí)學(xué)習(xí)!!!!...

1144100656 2018-05-31

大神在哪里呀,大神在哪里呀,大神在哪里呀.

1152696398 2018-05-31

這個(gè)問題我也不清楚,等大佬來(lái)解決吧。。

要回復(fù),請(qǐng)先登錄 或者注冊(cè)