文件映射無助于增加進(jìn)程可用地址空間。除非你修改set的實現(xiàn),把對節(jié)點的訪問直接
對應(yīng)到對文件的訪問,但是在大數(shù)據(jù)量的情況下,隨機(jī)訪問的效率很差。
關(guān)鍵還是在于減少內(nèi)存的使用上
1. stl 中的set使用紅黑樹實現(xiàn)的,一個節(jié)點有左,右,父節(jié)點三個指針和一個紅黑標(biāo)志位.32位系統(tǒng)下最少占用13個字節(jié),
考慮內(nèi)存對齊下,可能使用到16個字節(jié),在大數(shù)據(jù)量的情況下,為了保持這個樹結(jié)構(gòu),額外使用的內(nèi)存是很多的,可以考慮使用hash set.
2. url長度都比較長,可考慮計算md5 hash,減少存儲占用.
3. 不要妄想把所有數(shù)據(jù)都存在內(nèi)存,總會有內(nèi)存耗盡的時候,另外,如果程序異常或者崩潰,所有數(shù)據(jù)將丟失.
我以前實現(xiàn)的一種方式是,以數(shù)據(jù)庫為主要存儲,內(nèi)存作為優(yōu)先查詢cache.
1. 數(shù)據(jù)庫建散列表, 以十六進(jìn)制 0-F 開始,根據(jù)md5第一位決定存儲表,用于存儲md5值,并對md5建索引加快查詢.
2. 在內(nèi)存中用set或map保存md5值,查詢時先計算url md5值,再查詢內(nèi)存,如果不存在,則從數(shù)據(jù)庫加載.如為新url,先存入內(nèi)存.
3. 內(nèi)存總量到一定閥值,進(jìn)行數(shù)據(jù)保存,并清空內(nèi)存cache.
不過這種實現(xiàn)存在cache命中問題,你可以一次加載整張表,也可以用 like 查詢條件,減少數(shù)據(jù)庫返回的記錄數(shù).
已有的php實現(xiàn),內(nèi)存cache200萬條記錄,總內(nèi)存使用在1200M左右,可長時間運(yùn)行,沒有內(nèi)存使用問題.
回復(fù) 更多評論