0

我用 Java 编写了一个网络爬虫,我正在使用 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,考虑到存储的数据,这绝对是疯狂的。数据库将网页存储在 EntityStore 中,我会定期同步它。无论我改变什么,我都无法让磁盘使用率下降!

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

关于EntityStore,我有什么遗漏吗?

需要注意的一件事是,我既要从数据库中读取又要从数据库中写入,因此我无法设置任何标志以使其仅写入或其他内容。而且我不希望过多增加缓存大小,因为这是一个对堆空间敏感的环境。

4

1 回答 1

0

问题在于延迟写入。我必须启用延迟写入,然后在计时器上调用 env.sync() 以保持数据库处于检查状态,而不是在每次放置时调用 env.sync()。体积缩小了 30 多倍……

于 2012-05-01T03:52:53.623 回答