Tag: 任务并行库

每次读取Excel工作表时使用并行foreach的不同结果

Imports System.IO Imports System.Threading Imports System.Threading.Tasks Imports System.Collections.Concurrent Imports Excel = Microsoft.Office.Interop.Excel Public Class TestCarDatas Public Property RowID As Integer Public Property ModelYear As Integer Public Property VehMfcName As String Public Property EmgVeh As Boolean End Class Module ExcelParallelDataGather2 Public Const ExcelVehDataPath As String = "D:\Users\Dell\Desktop" Public rwl As New System.Threading.ReaderWriterLock() Public rwl_writes As Integer […]

parsing大型Excel文件列表失败

这是一个C#/ VSTO程序。 我一直在做一个数据捕获项目。 范围基本上是“处理各种第三方公司发送的Excel文件”。 实际上,这意味着: 通过search方法find包含我想要的数据的列。 从工作簿中获取数据 清理数据,运行一些计算等 将清理的数据输出到新的工作簿中 我写的程序对于中小型数据集非常有用,大约有25个工作簿,总共有大约1000行相关数据。 我从这些工作簿中抓取了7列数据。 我有一个边缘案例,有时候我需要运行一个更大的数据集,大约50个工作簿,共有约8000行相关数据(可能还有2000个重复数据,我也必须删除)。 我目前正在通过一个Parallel.ForEach循环里面的文件列表,我打开一个new Excel.Application()处理每个文件与多个ActiveSheet s。 在较小的数据集上,并行处理的运行速度要比顺序处理的要快得多。 但是在更大的数据集上,我似乎碰壁了。 我开始收到消息: Microsoft Excel is waiting for another application to complete an OLE action ,最终它只是失败。 切换回顺序foreach确实允许程序完成,但它只是磨合 – 从1至3分钟的平行中等规模的数据集到20分钟以上的连续大型数据集。 如果我把ParallelOptions.MaxDegreeOfParallelism设置为10,它会完成这个循环,但是仍然需要15分钟。 如果我将它设置为15,则失败。 如果我不需要,我也不喜欢弄乱TPL设置。 我也尝试过插入一个Thread.Sleep来手动减慢速度,但是这只会让失败发生。 我closures工作簿,退出应用程序,然后将GC.WaitForPendingFinalizers到每个循环结束时的Excel对象和GC.Collect和GC.WaitForPendingFinalizers 。 我现在的想法是: 将列表分成两半,分别运行 并行打开一些new Excel.Application() ,但是在该Excel实例内依次运行一个文件列表(有点像#1,但使用不同的path) 按文件大小分开列表,并独立/按顺序运行一小组非常大的文件,像以前一样运行其余的文件 我希望得到一些帮助: 关于如何确保我的记忆被清除的build议(也许Process.Id在所有的开始和结束都被扭曲了?) 关于订购一个并行stream程的build议 – 我想知道如果我能把这个“大”的人放在第一位,这将使长期运行的stream程更加稳定。 我一直在看: http : //reedcopsey.com/2010/01/26/parallelism-in-net-part-5-partitioning-of-work/ […]