posts - 7,  comments - 64,  trackbacks - 0
    我想写一个爬虫程序。现在需要存放访问过的URL。如果用数据库存放则太慢,若放在默认的SET容器中,当到达一定数量时会使程序崩溃。
现在我想把文件直接映射成set<string>容器的空间。也就是set申请的内存全部在我所指定的文件中。
另外程序可用4G空间中有2G是系统保留的。如果进行文件映射后,是不是也只能访问2G的空间?
最后,我想问问,如果我进行了文件映射,同时又从实际内存中申请了一快内存,如何保证映射的地址和从内存中申请的地址不重复呢?
请大家帮帮忙,最后有源码或网站参考。
posted on 2010-12-10 16:18 HIT@ME 阅读(1989) 评论(6)  编辑 收藏 引用

FeedBack:
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。[未登录]
2010-12-10 18:49 |
自己研究下set的第三个模板参数
basic_string也同样是第三个模板参数
  回复  更多评论
  
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。[未登录]
2010-12-10 20:58 | hdqqq
文件映射无助于增加进程可用地址空间。除非你修改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左右,可长时间运行,没有内存使用问题.
  回复  更多评论
  
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。
2010-12-11 16:15 | 匿名人士
按你描述,问题可以拆成两个,1是文件到内存数据的转换,2是数据的组织

一个一个来解决。问题1 用序列化就得了,boost还是什么的随意
问题2 你可以不用把数据类(假设是用序列化)的本体放set/map里啊,自己用new来控制数据,map里只索引数据的引用或指针,那不就得了  回复  更多评论
  
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。
2010-12-12 20:26 | 陈梓瀚(vczh)
CreateFileMappingObject?这个api是不是这么叫我忘记了
第二个是set最后一个模板参数,是一个allocator,用来控制set内部的内存。  回复  更多评论
  
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。
2010-12-12 21:31 | 空明流转
现在首页求助都成风了。。。  回复  更多评论
  
# re: 求助。关于如何将文件映射成STL容器内存空间的方法。
2010-12-12 21:34 | 空明流转
回答你部分问题的说,
第一个,内存映射会吃你的地址空间,所以也就是只有2G可用,在32bit下。
如果你需要巨大的空间,建议使用64bit,或者使用其他的存储方案,比方说B-Tree;
第二个问题,关于Address Overlapping的问题,因为第一条,所以不会的。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(5)

随笔档案

test

搜索

  •  

最新评论

阅读排行榜

评论排行榜