系统相关
首页 > 系统相关> > 使用实体框架,随着时间的推移,Nop Commerce产品导入速度变慢并且使用更多的内存

使用实体框架,随着时间的推移,Nop Commerce产品导入速度变慢并且使用更多的内存

作者:互联网

我需要将大约15万种具有类别,制造商,图像和属性的产品导入Nop Commerce.我写了一个基于Nop.Services.ExportImport.ImportManager的插件.导入的产品越多,导入过程的运行速度就越慢.前100种产品将在1.5分钟内导入.进口大约2500种产品需要花费15到20分钟的时间才能进口另外100种产品.一次导入2500多种产品会导致“内存不足”异常.在2500停下来然后进行第二次导入后,事情甚至运行得更慢.

这是插件使用的过程:

>创建一个新产品实体,填充详细信息,然后使用Nop.Services.Catalog.ProductService.InsertProduct插入产品.必须使用ProductService,因为我们需要Product.ID的值才能将子对象添加到产品中.
>首先搜索制造商是否存在,以添加产品制造商.如果找不到制造商,则创建制造商并使用ManufacturerService添加.然后添加一个ProductManufactuer实体,将产品分配给制造商.该实体被添加到列表对象.
>对类别,规格属性,URL记录和产品标签执行相同的例程.
>下载第一个图像并使用PictureService添加. PictureService将Picture实体插入数据库,然后将图像保存到images目录.然后创建一个ProductPicture实体并将其添加到列表中.
>每100个产品中,我使用SQLBulkCopy / EFBulkInsert将ProductManufacturers,ProductCategories,ProductImages等列表插入数据库.然后,我清除列表,然后重新开始.

因此,在整个过程中,我们使用实体框架将产品,类别,制造商,产品标签和规格属性一一添加到数据库中.这是必需的,因为我们需要获取这些项目的ID,以便通过将记录插入映射表中来将它们分配给产品.可以将添加到映射表的记录添加到列表,然后使用SQLBulkCopy / EFBulkInsert将其批量插入数据库.

每次添加产品及其属性,整个过程就会越来越慢.随着时间的流逝,它似乎还会使用越来越多的内存.我不确定下一步该怎么做.

我不确定Entity Framework是否引起了问题.我读到随着时间的流逝,Entity Framework倾向于使用越来越多的内存,并且每隔一段时间重置一次DBContext是一个好主意.问题在于Nop通过Nop.Data中的EFRepository层管理DBContext.

使用EFBulkInsert / SQLBulkCopy将产品属性映射记录添加到数据库中似乎可以加快速度.我考虑过可能要先使用并插入所有产品,然后再进行第二次导入属性.我仍然会遇到无法将Picture实体批量导入数据库的问题,因为我需要PictureID加上ProductID才能将图片与产品相关联.

我还考虑过使用ADO.NET和存储过程来一对一地进行插入,但是不确定是否会改善.有没有人有什么建议?

解决方法:

我是EFUtilities https://github.com/MikaelEliasson/EntityFramework.Utilities的作者,该工具除其他功能外还进行批量插入.对于下一个版本,它将能够从批量插入中返回商店生成的ID.

目前,此功能有效,但尚未发布.我希望在本周末或下周末发布.同时,您可以在https://github.com/MikaelEliasson/EntityFramework.Utilities/blob/release20/EntityFramework.Utilities/EntityFramework.Utilities/SqlQueryProvider.cs#L56上找到它的代码,如果下载并构建release20分支,则应该可以使用它.

这是显示如何启用Id返回的测试(速度稍慢,因此默认情况下处于禁用状态)https://github.com/MikaelEliasson/EntityFramework.Utilities/blob/release20/EntityFramework.Utilities/Tests/InsertTests.cs#L125

using (var db = Context.Sql())
{
     EFBatchOperation.For(db, db.BlogPosts).InsertAll(list, new BulkSettings
            {
                ReturnIdsOnInsert = true,
            });
}

标签:nopcommerce,c,entity-framework
来源: https://codeday.me/bug/20191120/2042568.html