2012-04-30 84 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倍以上...