首页新闻找找看学习计划

当数据量庞大的时候该如何优化代码?

0
悬赏园豆:5 [已解决问题] 解决于 2017-03-03 15:58

我需要取出十张表的内容,平均每张表500条数据左右,取出来的数据需要mapper成对应的model,然后赋值给实体,转换为json.

我的model结构是这样的

 1 public class DownloadSessionModel:ResultMessage
 2     {
 3         public List<AModel> AModels { get; set; } 
 4          public List<BModel> BModels { get; set; } 
 5   public List<CModel> CModels { get; set; } 
 6   public List<DModel> DModels { get; set; } 
 7   public List<EModel> EModels { get; set; } 
 8   public List<FModel> FModels { get; set; } 
 9   public List<GModel> GModels { get; set; } 
10   public List<HModel> HModels { get; set; } 
11   public List<IModel> IModels { get; set; } 
12   public List<JModel> JModels { get; set; } 
13         public K K{ get; set; }
14         public string LVersion { get; set; }
15     }

具体实现方式就是,

使用ef,从数据库中取得数据,然后map为model,并赋值

可是我使用单元测试的时间为  624ms

如果使用集成测试的话,有时为1分左右,有时会更多,有时还会超时,请问像这样的情况,有办法优化一下嘛?

或者说,是我写的代码太那个什么。。。

跪求

大神

临冰听雪丶的主页 临冰听雪丶 | 初学一级 | 园豆:5
提问于:2017-03-01 10:42
< >
分享
最佳答案
0

加个stopwatch,看看集成测试的时候,EF用了多少时间拉取数据,mapping用了多少时间,然后转换为json用了多少时间。

你才知道哪里出问题了。

收获园豆:5
c99 | 小虾三级 |园豆:1832 | 2017-03-01 20:32

我刚才用您说的方式试了后,发现,取数据只用了4秒,而map数据用了51秒。。保存数据用了7秒。

Map数据我用的是AutoMapper,请问AutoMapper的效率有这么差吗?

不知有没有什么补救或者改善的办法呢?

临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-02 10:53

@临冰听雪丶: 没有代码的话,不太清楚。你可以检查mapping的过程

1. 是否存在不断复制全部或部分数据的情况?

2. 是否中间有锁没有及时释放

3. 你的Model类的属性是否存在约束检查的过程,并且这个过程比较耗时间

c99 | 园豆:1832 (小虾三级) | 2017-03-02 12:22

@c99: 

 var testModle =
                    Mapper.Map<IEnumerable<AModel>>(Data.Select(s => s.BEntity.CEntity));
                if (testModle== null)
                {
                    testModle= new List<AModel>();
                }

这个就是我map的过程,Model的话就是上面那个样子,一个Model里面套着很多的List,而每个list里面有500条左右的数据,list中的Model只是简单的prop。

代码没有用到锁,以及约束检查。

至于您说的第一点,不断复制全部或部分数据,我不太明白您说的这个是什么意思?

临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-02 12:46

@临冰听雪丶: 你看看Data.Select()这个过程要用多少,再看Mapper.Map<>()这个过程要用多少,然后每个List的创建和数据增加要耗费多少。如果你有十几个的类似过程,可能Data.Select()这里有优化的空间。

c99 | 园豆:1832 (小虾三级) | 2017-03-02 15:23

@c99: 刚测试了一下,select几乎没有用时间,而map整整用了1分钟。。

临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-02 17:35

@临冰听雪丶: 你是怎么创建map的?

c99 | 园豆:1832 (小虾三级) | 2017-03-02 20:09

@临冰听雪丶: 你去把AutoMapper的源代码弄下来,替换掉项目里引用的那个dll。看起来像是AutoMapper的性能问题.

c99 | 园豆:1832 (小虾三级) | 2017-03-02 20:24

@c99: 找到问题了,是因为virtual。model中有一个name需要显示,而这个name是在另一个entity中,如果map时,不做处理,而直接点出第二个entity的属性的话,就会超级慢。

临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-03 15:57
其他回答(1)
0

我觉得应该先搞清楚问题出在哪里,是数据库读取慢,还是读取出来数据转换为model慢,还是其他.....

 

 数据库慢的可能性比较大,这点数据不算多,是否可以通过增加适当的索引来提升速度。还不行的话只好用分区,分表的方法了

会长 | 园豆:5255 (大侠五级) | 2017-03-02 10:53

刚才测试了下,貌似是因为AutoMapper 在map数据的时候耗时比较久。不知道是我写法有问题还是AutoMapper得效率本来就这么差?

支持(0) 反对(0) 临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-02 10:56
  var testModle =
                    Mapper.Map<IEnumerable<AModel>>(Data.Select(s => s.BEntity.CEntity));
                if (testModle== null)
                {
                    testModle= new List<AModel>();
                }

就都是这样的方式,先select,然后再map,差不多有十几个

支持(0) 反对(0) 临冰听雪丶 | 园豆:5 (初学一级) | 2017-03-02 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册