通过并行 提高批量审核PDF性能
上一篇文章提到了 通过 iTextSharp 实现PDF 审核盖章 ,如果当需要一次审核大批量的PDF我们如何来提高程序的性能呢?
下面我们通过并行计算来提升性能。
首先是一个审核PDF的方法
- public class PDFManage
- {
- public string PDFApprove(string path)
- {
- //内部实现参见上一篇文字
//返回是新的PDF路径- }
- }
然后是普通的实现,我们拿到一个所有需要审核的PDF Path 集合 IList<string> pathLists
- PDFManage pdfManage = new PDFManage();
- foreach (var item in pathLists)
- {
- pdfManage.PDFApprove(item);
- }
下面是并行的实现
- Parallel.ForEach(pathLists, //可枚举的数据源
- (itemPath, loopState) => //Action<TSource, ParallelLoopState> 的lambda表达式 形式 :将为每个迭代调用一次的委托
- {
- PDFManage pdfManage = new PDFManage();
- pdfManage.PDFApprove(itemPath);
- });
为什么要把 PDFManage 实例放在每次迭代里面呢? 为了避免写入共享内存位子,每当多个线程同时访问时,都很有可能出现争用条件。 即使您可以使用锁来同步访问,同步开销也可能会对性能造成损害
当我需要有拿到每一个审核后的新的PDF路径一个如何做呢?
普通的实现我在这里就不写了,使用线程局部变量 Parallel.ForEach 循环来实现
- IList<string> ApproveLists = new List<string>();
- Parallel.ForEach(pathLists, //source 可枚举的数据源
- () => { return new List<string>(); }, //用于返回每个任务的本地数据的初始状态的函数委托
- (itemPath, loop, ApprovePaths) => //将为每个迭代调用一次的委托
- {
- PDFManage pdfManage = new PDFManage();
- ApprovePaths.Add(pdfManage.PDFApprove(itemPath));
- return ApprovePaths;
- },
- (finalResult) => //用于对每个任务的本地状态执行一个最终操作的委托(每个线程结束时最总会到这里来)
- {
- foreach (var item in ApproveLists)
- {
- finalResult.Add(item);
- }
- //以原子操作的形式,将指定ApproveLists变量设置为指定finalResult值
- Interlocked.Exchange(ref ApproveLists, finalResult);
- });
使用并行的时候还需要注意: 不要假定并行始终速度更快,并行循环可能比顺序循环的运行速度慢。具有很少迭代和快速用户委托的并行循环未必会快很多。
计算机上的处理器数限制了并行化的优点。 在仅仅一个处理器上运行多个主要进行计算的线程时,速度并不会得到提升。
所以我们要加一些设定来优化一下
- // 获取当前服务器处理器数量
- int procCount = System.Environment.ProcessorCount;
- // 获取当前集合源的数量
- int ListCount = pathLists.Count();
// 通过判断服务器的处理数量, 已经集合源的数量来决定是否需要进行并行计算。
总结一下使用并行:
1.并行不一定更快,源的数量、委托的操作有关。
2.并行时每个迭代调用内部不要有共享内存位子(简单说就是单线程和多线程争用条件的问题)
3.大多数静态方法都是可同时从多个线程中调用。 但是,即使在这些情况下,所涉及到的同步也可能导致速度大幅减慢。
工作点滴,持续提升
通过并行 提高批量审核PDF性能的更多相关文章
- EF批量添加数据性能慢的问题的解决方案
//EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...
- mysql 如何提高批量导入的速度
mysql 如何提高批量导入的速度 最近一个项目测试,有几个mysql数据库的表数据记录达到了几十万条,在搭建测试环境 导入 测试数据时,十分慢.在网上搜索了一下,有下面一些方法可以加快mysql数据 ...
- 使用SQL-Server分区表功能提高数据库的读写性能
首先祝大家新年快乐,身体健康,万事如意. 一般来说一个系统最先出现瓶颈的点很可能是数据库.比如我们的生产系统并发量很高在跑一段时间后,数据库中某些表的数据量会越来越大.海量的数据会严重影响数据库的读写 ...
- 使用内存虚拟硬盘 提高ArcGIS server并发性能的一种方法
1 问题提出 1.1 概述 提高ArcGIS server并发性能的方法很多,本文讨论在用户硬件足够强大的情况下(主要是内存足够大),使用内存模拟硬盘来提高数据的读取效率,以达到提高ArcGIS se ...
- MySQL批量SQL插入性能优化
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...
- 提高 Linux 上 socket 性能
http://www.cnblogs.com/luxf/archive/2010/06/13/1757662.html 基于Linux的Socket网络编程的性能优化 1 引言 随着In ...
- 使用Zend OpCache 提高 PHP 5.5+ 性能
使用Zend OpCache 提高 PHP 5.5+ 性能 作者:admin | 时间:February 28, 2015 | 分类:Linux | 评论:1 评论 PHP 5.5 以后内建了 OpC ...
- 使用异步 I/O 大大提高应用程序的性能
使用异步 I/O 大大提高应用程序的性能 学习何时以及如何使用 POSIX AIO API Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出之后,应用程序就会阻 ...
- 走向DBA[MSSQL篇] - 从SQL语句的角度提高数据库的访问性能(转)
最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带来的宝贵财富,欢迎其他的DBA来拍砖. 目录 1.什么是执行计划?执行计划 ...
随机推荐
- eclipse打开一闪而过,环境安装正确
一:查看错误信息 开始,运行->cmd.execd 进入eclipse目录D:\JavaTools\eclipse\eclipse.exe>eclipsec.exe,看console输出是 ...
- HTML5 Canvas渐进填充与透明
详细解释HTML5 Canvas中渐进填充的参数设置与使用,Canvas中透明度的设置与使 用,结合渐进填充与透明度支持,实现图像的Mask效果. 一:渐进填充(Gradient Fill) Canv ...
- asp.net总结(一)
前言 asp.net的视频不是很多,但是中间由于毕业论文等一些事情.花的时间比较长,知识所以整体上学习的也不是很连贯 打算在总结的时候来复习一下这些知识.只能是大概的来了解asp.net到底有哪些东西 ...
- Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面, 但我们这里的是读取到xml里面的. 首先我 ...
- Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- 《UNIX网络编程》之read_timeout实验
最近在做项目,需要做一个服务器和客户端的基于TCP的套接口网络编程,由于服务器端返回数据并不是那么的及时,因此,需要在客户端做些延迟,然后才能去读取数据,实验测试结果如下. 首先,我们先来看一下我们封 ...
- Visual Studio 2012 Ultimate 上安装 Python 开发插件 PTVS
1.我的环境 操作系统:32位 Win7 旗舰版 Service Pack 1 VS版本:Microsoft Visual Studio Ultimate 2012 版本 11.0.50727.1 R ...
- Android中完全退出当前应用系统
一.将统一管理Activity的类ActivityManager复制到工程里面. package com.jsmtr.www.Helper; import java.util.LinkedList; ...
- Example_07_05录音提示open failed: EACCES (Permission denied)
在AndroidManifest.xml文件中加入下面这句话:<uses-permission android:name="android.permission.WRITE_EXTER ...
- Ecstore获取dbschema内容?
有时候在使用dbschema的时候,需要获取dbschema的结构.例如: 那么,我们可以这样写: 这样我就能获得 称呼 这个数组