2012-04-30 9 views
0

私はJavaでWebクローラを作成しました。私は、後でインデックスを作成するなどのために、私がクロールしたページを保存するためにBerkeley DBを使用しています。 (通常は多くて500キロバイトよりもさらに巨大ページ)Berkeley DB(JE)が制御不能になった

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

最大のフィールドが全体HTMLコンテンツである文字列ドキュメンテーション文字列、次のとおりです。私は、次のインスタンスフィールドを持つWebページを対象として、各ページを保存していますstringLinksはページ上の各アウトバウンドリンクの文字列を保持します。それはあまりにも大きくすべきではありません。たいてい、100文字の長さ〜70(数KBでさえありません)です。

1秒あたりのページ数が1秒より少し速く、たまには2ページになることもあります。バークレーデータベースは1ページあたり約2〜3MBになります。データベースはWebページをEntityStoreに格納し、定期的に同期します。私が何を変えても、私はディスク使用量を減らすことはできません!

これは非常に大きな問題です。クローラの複数のインスタンスを実行すると(私はそれをビルドしてビルドしています)、それぞれがすばやく大量のディスク領域を使用するためです。これが直線的に増加しているなら、私はうまくいくかもしれませんが、この空間がどのような機能を持っているのかを知る方法はありません。私はすべて、実際のデータの何倍ものスペースであることを知っています。

EntityStoreには何かがありますか?

私がDBから読み書きしているので、書き込み専用にフラグを設定することはできません。また、これはヒープスペースに敏感な環境なので、キャッシュサイズを大幅に増やさないことをお勧めします。

答えて

0

問題は遅延書き込みでした。遅延書き込みを有効にして、各putでenv.sync()を呼び出すのではなく、DBをチェックするためにenv.sync()をタイマーで呼び出す必要がありました。サイズは30以上減少しました...

関連する問題