繁体   English   中英

C#序列化大型数据集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM