Berkeley DB(JE)越来越失控

时间:2012-04-30 01:29:46

标签: web-crawler berkeley-db berkeley-db-je

我已经用Java编写了一个Web爬虫,我正在使用Berkeley DB来保存我抓取的页面(以便以后编制索引等)。我将每个页面存储为网页对象,其中包含以下实例字段:

@PrimaryKey
String url;
String docString;
Date lastVisited;
Date lastChecked;
ArrayList<String> stringLinks;

最大字段是String docString,它是整个HTML内容(即使在大页面上也通常不超过500KB),stringLinks为页面上的每个出站链接保留一个String。这不应该太大,最多只有100串长度~70(甚至不到几KB)。

我的抓取速度比每秒页面快一点,有时每秒2页,我看到伯克利数据库每页增长到大约2-3MB,这对于存储数据绝对是疯狂的。数据库将Web页面存储在EntityStore中,并定期对其进行同步。无论我改变什么,我都无法让磁盘使用率下降!

这是一个非常大的问题,因为如果我运行爬虫的多个实例(我已将其构建为分布式),则每个实例都会快速使用大量磁盘空间。如果这是线性增加的话,我可能没问题,但是没有办法说出这个空间膨胀的功能。我只知道它是实际数据空间的很多倍。

我对EntityStore缺少什么?

有一点需要注意的是,我是从DB读取和写入的,所以我不能设置任何标志来使它只写或其他东西。我宁愿不要增加缓存大小,因为这是一个堆空间敏感的环境。

1 个答案:

答案 0 :(得分:0)

问题在于延迟写入。我必须启用延迟写入然后在计时器上调用env.sync()以保持DB的检查,而不是在每个put上调用env.sync()。尺寸减少了30多倍......