C#开发-分批次处理超大量列表

时间:14-07-24 栏目:C#开发 作者:kyle 评论:0 点击: 5,331 次

太久没更新过博客了。正在跑数据,无聊来更新一点关于C#的东西。

 

手上采集到3万多文章,要更新到全文检索服务器里面。量太大了,程序会快内存卡爆。

网络也不能一次性处理这大批量的数据。于是需要把这批数据,按100篇文章为一个单位存到远程去。

 

直接上代码吧。写了一个通用的方法,可以把数据拆成指定数量去执行动作。

/// <summary>
/// 把列表分成多少份,然后执行Action
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items">要处理的列表</param>
/// <param name="numPerPage">每页显示多少数据</param>
/// <param name="action">要执行的动作</param>
public static void SplitList<T>(IEnumerable<T> items, int numPerPage, Action<IEnumerable<T>> action)
{
    int totalCount = items.Count();//总数量
    int pages = ParsePage(totalCount, numPerPage);//根据总数量计算得到这些能产生多少页面。

    for (int i = 0; i < pages; i++)
    {
        Console.WriteLine("【" + totalCount + "】条数据拆成了【" + pages + "】页,正在处理【" + (i + 1) + "】页");
        var tempList = items.Skip(i * numPerPage).Take(numPerPage);
        if (tempList != null)
            action(tempList);
    }
}

其中的

parsePage是我写的一个方法,比如你有12345个文章,想每份100条数据。这个方法可以处理出结果告诉你可以分成124页。

核心是这样的。

/// <summary>
/// 根据数据总量和每页有多少数量,计算有多少个页面
/// 例如102条,每页10条,应该有11页
/// </summary>
/// <param name="totalNum">总数据量</param>
/// <param name="pageNum">每页数量,默认每页100条</param>
/// <returns>返回应该有多少页</returns>
public static int ParsePage(int totalNum, int pageNum = 100)
{
    int page = 0;
    if (totalNum <= pageNum) return 1;//如果共总数量,小于每页数量,那只有一页
    try
    {
        page = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(totalNum) / Convert.ToDecimal(pageNum)));
    }
    catch (System.Exception ex)
    {
        page = 0;
    }
    return page;
}

 

最后怎么用呢。看我的。

//拆分列表,每100条上传一次
SplitList<ModelExpando>(listArticles, 100, (list) =>
{
    //list就是其中100条数据,更新到数据库吧。下面的更新代码可以自由写
    result = DB_Juhe.Update(list);
});

把listArticles里面的数据,每100条,执行一次操作。这里可以是任何实现了IEnumerable的列表,比如string[],List<T>等。

以后每次要分批处理大量的数据,我只需要3行代码即可进行一次复杂的操作。

 

C#和php还有python这些,都是差不多的。平时开发的时候,可以尽可能的抽离出代码封装成函数或者类。

希望有搞C#的朋友能参考一下,搞出来更牛B的代码

成都SEO小五嚎2句: 本文是(成都SEO小五)辛苦弄出来的,转载成都SEO小五原创的请保留链接: C#开发-分批次处理超大量列表,3Q

C#开发-分批次处理超大量列表:等您坐沙发呢!

来给哥评论评论


------====== 小五公告 ======------
成都SEO小五,专注成都搜索引擎优化。
小五善长站内外优化,C#、PHP开发,中英文SEO,Google中英文和百度优化技术。欢迎群内交流。伸手党请绕路,求资源的请绕开,求问题解答的请进群内交流。开放了一个QQ交流群:160750032。加入验证时请标注任何SEO相交字眼。友情链接直接Q我,收录正常,内容大部份原创、SEO或者程序开发、网络营销、线上推广等相关行业即可。

常用工具

赞助广告

来看过哥的人