3

カスタムキャッシュ実装のバックエンドとしてdb4oを使用したいと思います。通常、私のプログラムでは、約40,000,000個のオブジェクトをメモリにロードし、それらを同時に処理します。明らかに、これには大量のメモリが必要であり、おそらくいくつかのオブジェクト(キャッシュにないオブジェクト)をdb4oデータベースに永続化することを考えました。私の予備テストでは、db4oが私が望むよりも少し遅いことが示されています(約1,000,000個のオブジェクトが持続するのに17分かかりました)。しかし、私は最も基本的な設定を使用していました。

私はこのようなことをしていました:

using (var reader = new FileUnitReader(Settings, Dictionary, m_fileNameResolver, ObjectFactory.Resolve<DataValueConverter>(), ObjectFactory.Resolve<UnitFactory>()))
using (var db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), path))
{
    var timer = new Stopwatch();
    timer.Start();
    IUnit unit = reader.GetNextUnit();
    while (unit != null)
    {
        db.Store(unit);
        unit = reader.GetNextUnit();
    }
    timer.Stop()
    db.Close();

    var elapsed = timer.Elapsed;
}

このシナリオでパフォーマンスを改善する方法について誰かがアドバイスを提供できますか?

4

2 に答える 2

2

この状況でパフォーマンスを向上させるためのオプションがいくつかあると思います。

また、このようなシナリオでのリフレクションオーバーヘッドが非常に大きな部分になる可能性があることも発見しました。したがって、ケースに高速リフレクターを試してみてください。FastReflectorはより多くのメモリを消費することに注意してください。ただし、シナリオでは、これは実際には重要ではありません。次のような高速リフレクターを使用できます。

var config = Db4oEmbedded.NewConfiguration();
config.Common.ReflectWith(new FastNetReflector());

using(var container = Db4oEmbedded.OpenFile(config, fileName))
{
}

同様の小さな「ベンチマーク」を実行したとき、データベースに書き込んだ場合でも、キャッシュサイズを大きくするとパフォーマンスも少し向上することがわかりました。

var config = Db4oEmbedded.NewConfiguration();
config.File.Storage = new CachingStorage(new FileStorage(), 128, 1024 * 4);

その他の注意事項:db4oのトランザクション処理は、巨大なトランザクション用に実際には最適化されていません。1つのトランザクションに1'000'000のオブジェクトを格納すると、コミットに時間がかかるか、メモリが不足する可能性があります。したがって、より頻繁にコミットすることをお勧めします。たとえば、100,000個の保存されたオブジェクトごとにコミットします。もちろん、それがシナリオに本当に影響を与えるかどうかを確認する必要があります。

于 2010-07-11T16:27:00.900 に答える
1

あなたが試すことができるもう一つの小さな改善:

OpenFile()呼び出しに.Ext()を追加して、拡張インターフェースを取得します。

保存した後、すべてのオブジェクトをパージします。

using (var db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), path).Ext())
// ....
db.Store(unit);
db.Purge(unit);
// ....

そうすれば、db4oが現在のトランザクションで維持しなければならない参照の数を減らすことができます。

おそらく、ストレージ構成(db4oより下のプラグ可能なファイルシステム)を試してみると、さらに大きな改善の可能性が最も高くなります。最新の8.0ビルドには、より大きなキャッシュメンテナンスのパフォーマンスを低下させない、より優れたキャッシュ実装があります。キャッシュページの数。

Gamlorが提案したキャッシュ設定を使用して最新の8.0ビルドを試して、違いが生じるかどうかを確認することをお勧めします。

config.File.Storage = new CachingStorage(new FileStorage(), 128, 1024 * 4);

もしそうなら、あなたはまた、はるかに高い数を試すことができます:

config.File.Storage = new CachingStorage(new FileStorage(), 1280, 1024 * 40);
于 2010-07-12T18:22:30.193 に答える