gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:33:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com