[英]C# Serializing large datasets
我正在尝试将数据从Microsoft SQL数据库移至Elasticsearch。 我正在使用EF 6生成模型(数据库中的代码优先),并使用NEST将对象序列化为Elasticsearch。
如果我使用延迟加载,则可以正常工作,但速度却令人难以置信(速度太慢,无法使用)。 如果我通过添加以下行切换到Eager加载:
public MyContext() : base("name=MyContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
并像这样序列化:
ElasticClient client = new ElasticClient(settings);
var allObjects = context.objects
.Include("item1")
.Include("item2")
.Include("item2.item1")
.Include("item2.item1.item");
client.IndexMany(allObjects);
在进行序列化之前,我最终得到了System.OutOfMemoryException(因此仅通过加载数据)。 我有大约2.5 GB的可用内存,我们正在谈论数据库中的110.000项。
我尝试对数据进行排序,然后使用“跳过并获取”一次仅序列化一定数量的对象,但是在内存用完之前,我仅设法将60.000个对象插入到Elasticsearch中。 似乎垃圾回收器没有释放足够的内存,即使我在将一定数量的对象插入Elasticsearch之后也明确地调用了它。
有没有办法渴望加载特定数量的对象? 还是另一种序列化大型数据集的方法?
事后看来,这是一个愚蠢的错误。 通过这样做,我设法实现了自己的目标:
int numberOfObjects;
using (var context = new myContext())
{
numberOfObjects = context.objects.Count();
}
for (int i = 0; i < numberOfObjects; i += 10000)
{
using (var context = new myContext())
{
var allObjekts = context.objects.OrderBy(s => s.ID)
.Skip(i)
.Take(10000)
.Include("item1")
.Include("item2")
.Include("item2.item1")
.Include("item2.item1.item");
client.IndexMany(allObjekts);
}
}
由于上下文被包装在for循环中,因此Gargage收集器可以执行其工作。 我不知道是否有更快的方法,我能够在大约400秒内在Elasticsearch中插入大约100.000个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.