2012-04-30 26 views
0

我已经用Java编写了一个Web爬虫程序,并且我使用Berkeley DB来保存抓取的页面(用于以后的索引等)。我存储每个页面的网页对象,它具有以下实例字段:Berkeley DB(JE)日益失控

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

最大的领域是字符串文档字符串,这是整个HTML内容(通常不超过500KB,甚至一个巨大的页)而字符串链接为页面上的每个出站链接保留一个字符串。这不应该太大,最多它是100个字符串的长度〜70(甚至不是几KB)。

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

这是一个很大的问题,因为如果我运行爬虫的多个实例(我已经构建它来分布),它们每个都会快速使用大量的磁盘空间。如果这个线性增加,我可能会好起来,但是没有办法告诉这个空间是什么函数膨胀。我只知道它是实际数据空间的许多倍。

有什么我缺少关于EntityStore的?

需要注意的一件事是,我既是从数据库读取数据,也是从数据库写入数据,所以我不能设置任何标记来使其只写或者其他东西。我不希望增加缓存大小,因为这是一个堆空间敏感的环境。

回答

0

问题是延迟写入。我必须启用延迟写入,然后在定时器上调用env.sync(),以便检查数据库,而不是在每个put上调用env.sync()。尺寸减少了30倍以上...