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