2013-01-23 188 views
3

我必须将简单的格式应用于10,000个以上的Excel文件。我已经有了一个多核计划。它为每个Excel文件打开一个新的Excel实例。如果重要的话,这段代码目前在我的表单代码中。是否可以在一个Excel实例中使用多核?

我希望用一个Excel实例有许多工作簿。如果我只使用一个Excel实例,是否可以利用多核功能?怎么样?

- 如果回答上面是否定的,更复杂的问题可能是:我应该如何Excel的许多情况下产卵,我怎么可以拆分每个实例的工作簿?

当前位置代码:下面

private void SelectFilesButtonClick(object sender, EventArgs e) 
{ 
    var listOfExcelFiles = OpenExcel.FileNames.ToList(); 
    Parallel.ForEach(listOfExcelFiles, TrivialExcelEditFunction); 
} 

private void TrivialExcelEditFunction(string file) 
{ 
    //Open instance of Excel 
    //Do processing 
    //Close instance of Excel 
} 

更新后的代码,但仍不能只局限于核心的适当数量。不知道为什么。

private void SelectFilesButtonClick(object sender, EventArgs e) 
{ 
    var listOfExcelFiles = OpenExcel.FileNames.ToList(); 
    int cores = Environment.ProcessorCount; 

    //Split one list into list of lists. Number of lists based on number of cpu cores 
    List<List<object>> listOfLists = Split(listOfExcelFiles, cores); 

    //Limits number of threads to number of cores 
    Parallel.ForEach(listOfLists, new ParallelOptions { MaxDegreeOfParallelism = cores }, EditExcel); 
} 

private void TrivialExcelEditFunction(string file) 
{ 
    //Open instance of Excel 

    foreach (string file in files) 
    { 
     //Do processing 
    } 
    //Close instance of Excel 
} 

可以说我有4个内核。我的想法是将文件列表分成4个相同的列表,将线程限制为4个,然后我可以在4个Excel实例中处理文件。我想认为这意味着TrivialExcelEditFunction将只运行4次。相反,该功能正在14到27次之间运行。请告诉我我错了哪里。

回答

1

我想这是@Servy是参照以上。我现在每天都在使用这个代码,我正在处理Excel,并且当然还没有失败。还要确保你正确编组你的COM对象。 有一点额外的信息,Excel 2010内部使用多核,注意性能(尤其是大文件)。

var tasks = new Task[Environment.ProcessorCount]; 

for (int i = 0; i< Environment.ProcessorCount; i++) 
{ 
    tasks [i] = Task.Factory.StartNew(() => 
    { 
     // your Excel code here.     
    }); 
} 

Task.WaitAll(tasks); 
+0

工作完美。没有必须重复打开和关闭Excel的开销,我将处理时间从每3秒1个文件减少到每秒5个文件。 – Brandon

2

创建N个任务/线程做处理,其中“N”是你的机器上的内核数量。给每个任务/线程一个Excel的实例。

您将无法控制多个线程中的单个实例(至少不会产生效果;它一次只能处理一个线程的任务),并且创建如此多的Excel实例效率相当低。

+0

我应该每个物理做一个实例核心还是每个逻辑核心? – Brandon

+0

@布兰登最可能是合乎逻辑的,但实际上只是尝试两种方法,看看哪个更快。 – Servy

+0

用新代码更新了问题。仍然没有运气。任何机会你可以提供更多的帮助? – Brandon

2

由于@Servy指出你可以创建多个线程,每个线程有一个Excel实例。

确保每个线程创建Excel对象它的使用。

期待古怪。拥有10,000多个文件,您至少可以期待少数问题。如果隐藏的Excel实例试图提示用户,它可能看起来是冻结的。使用一些函数调用到单线程COM对象时

Word有一些问题,我怀疑Excel中可能有一些人的了。在Word中,它们以各种方式表现出来,包括冻结或关闭的情况。

如果格式是非常简单的,你的文件xmlx它可能是可行的写一些代码申请通过OOXML SDK的变化,这将不要求实际的Excel实例

+0

当批处理存储哪些文件遇到错误并通知用户需要手动执行哪些文件时,似乎是处理错误的最合理方法。 – Brandon

+0

@Brandon这将是最好的方法,是的,除非你需要一个看门狗线程来检测你的一些工作线程是否被冻结。当你不恰当地解雇COM对象时,你会得到明显的内存泄漏 –

相关问题