Web crawler 伯克利DB(日本脑炎)失控

Web crawler 伯克利DB(日本脑炎)失控,web-crawler,berkeley-db,berkeley-db-je,Web Crawler,Berkeley Db,Berkeley Db Je,我已经用Java编写了一个web爬虫程序,我正在使用Berkeley DB保存我爬网的页面,以便以后索引,等等。。我将每个页面存储为一个网页对象,该对象具有以下实例字段: @PrimaryKey String url; String docString; Date lastVisited; Date lastChecked; ArrayList<String> stringLinks; 最大的字段是字符串docString,它是整个HTML内容,即使在一个巨大的页面上,通常也不超过

我已经用Java编写了一个web爬虫程序,我正在使用Berkeley DB保存我爬网的页面,以便以后索引,等等。。我将每个页面存储为一个网页对象,该对象具有以下实例字段:

@PrimaryKey
String url;
String docString;
Date lastVisited;
Date lastChecked;
ArrayList<String> stringLinks;
最大的字段是字符串docString,它是整个HTML内容,即使在一个巨大的页面上,通常也不超过500KB,stringLinks为页面上的每个出站链接保留一个字符串。这不应该太大,最多是100个长度为70到几KB的字符串

我的爬行速度比每秒一页快一点,有时是每秒2页,我看到伯克利数据库增长到每页2-3MB左右,考虑到存储的数据,这绝对是疯狂的。数据库将网页存储在EntityStore中,我会定期对其进行同步。无论我做了什么改变,我都无法降低磁盘使用率

这是一个相当大的问题,因为如果我运行多个我构建的爬虫实例,它们将很快占用大量的磁盘空间。如果这是线性增加,我可能会很好,但没有办法通过什么函数来判断这个空间正在膨胀。我只知道它是实际数据空间的很多倍

EntityStore有什么我遗漏的吗


需要注意的一点是,我同时从DB读取和写入数据,所以我不能设置任何标志使其仅写入或其他内容。而且我不希望将缓存大小增加太多,因为这是一个对堆空间敏感的环境。

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