文件映射无助于增加进程可用地址空间。除非你修改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左右,可长时间运行,没有内存使用问题.
回复 更多评论