c# - 在 db40 (.net) 中处理大型集合

标签 c# .net db4o

我想使用 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;
}

任何人都可以提供有关如何在这种情况下提高性能的建议吗?

最佳答案

嗯,我认为在这种情况下有几个选项可以提高性能。

我还发现,在这种情况下,反射开销可能会占很大一部分。所以你可能应该试试 fast-reflector对于你的情况。请注意,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'000'000 个对象时,提交可能需要很长时间或者内存不足。因此,您可能希望更频繁地提交。例如,在每 100'000 个存储对象之后提交。当然,您需要检查它是否真的对您的场景产生影响。

关于c# - 在 db40 (.net) 中处理大型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223060/

相关文章:

c# - 为什么 FileStream.Close() 挂起很长时间?

c# - 使用 StartsWith 将值与字符串数组进行比较

c# - db4o SODA 比较字段值

java - Db4o,Java : Storing images using blobs

c# - 更改 DataTable 列中每个单元格的值

c# - 将组合框绑定(bind)到 wpf 中的另一个组合框

c# - 为什么我收到错误 Cannot await 'void' ?

Java:d​​b4o可以存储org.w3c.dom.Node吗?

c# - 如何打印全尺寸 A4 页面?

c# - 如何忽略秒 ToShortTimeString