我用Java编写了一个网络爬虫,我正在使用Berkeley DB来保存我抓取的页面(用于以后的索引等(。 我将每个页面存储为一个 Webpage 对象,该对象具有以下实例字段:
@PrimaryKey
String url;
String docString;
Date lastVisited;
Date lastChecked;
ArrayList<String> stringLinks;
最大的字段是 String docString,它是整个 HTML 内容(即使在一个巨大的页面上通常也不会超过 500KB(,stringLinks 为页面上的每个出站链接保留一个字符串。 这不应该太大,最多是 100 个长度为 ~70 的字符串(甚至不是几个 KB(。
我爬行的速度比每秒一页快一点,有时每秒2页,我看到伯克利数据库增长到每页大约2-3MB,考虑到存储的数据,这绝对是疯狂的。 数据库将网页存储在实体商店中,我定期同步它。 无论我改变什么,我都无法让磁盘使用率下降!
这是一个相当大的问题,因为如果我运行爬虫的多个实例(我已经构建了它来分发(,它们每个实例都会快速使用大量的磁盘空间。 如果这是线性增加的,我可能没问题,但是没有办法判断这个空间正在膨胀的功能。 我所知道的是,它是实际数据空间的很多倍。
关于实体商店,我缺少什么吗?
需要注意的一件事是,我同时从数据库读取和写入,所以我无法设置任何标志来使其仅写入或其他内容。 而且我不想增加太多缓存大小,因为这是一个堆空间敏感的环境。
问题出在延迟写入上。 我必须启用延迟写入,然后在计时器上调用 env.sync(( 以保持数据库处于检查状态,而不是在每次放置时调用 env.sync((。 尺寸减小了 30 多倍......