3

10,000以上のExcelファイルに単純な書式を適用する必要があります。私はすでにマルチコアプログラムを動作させています。すべてのExcelファイルに対して新しいExcelインスタンスを開きます。重要な場合、このコードは現在私のフォームコード内にあります。

1つのExcelインスタンスを多くのブックで使用したいと思っていました。Excelのインスタンスを1つだけ使用する場合、マルチコア機能を利用することはできますか?どのように?

-上記の答えが「いいえ」の場合、より複雑な質問は次のようになります。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つに制限することでした。そうすれば、Excelの4つのインスタンスでファイルを処理できるようになります。これは、TrivialExcelEditFunctionが4回しか実行されないことを意味すると思いました。代わりに、この関数は14〜27回実行されています。どこが悪かったのか教えてください。

4

3 に答える 3

2

N個のタスク/スレッドを作成して処理を実行します。ここで、「N」はマシン上のコアの数です。各タスク/スレッドにのインスタンスを1つ与えますExcel

複数のスレッドから単一のインスタンスを制御することはできず(少なくとも生産的ではありません。一度に1つのスレッドのタスクでのみ機能します)、Excelの非常に多くのインスタンスを作成することは非常に非効率的です。

于 2013-01-23T15:03:26.417 に答える
2

@Servyが指摘したように、スレッドごとに1つのExcelインスタンスで複数のスレッドを作成できます。

各スレッドが、使用しているExcelオブジェクトを作成していることを確認してください。

奇妙さを期待してください。10,000以上のファイルを使用すると、少なくともいくつかの小さな問題が発生する可能性があります。非表示のExcelインスタンスがユーザーにプロンプ​​トを表示しようとすると、フリーズしているように見える場合があります。

シングルスレッドのCOMオブジェクトを呼び出すいくつかの関数を使用する場合、Wordにはいくつかの問題がありますが、Excelにもいくつかの問題があるのではないかと思います。Wordでは、これらはインスタンスのフリーズやクローズなど、さまざまな形で現れます。

フォーマットが本当に単純で、ファイルがxmlxの場合、実際のExcelインスタンスを必要としないOOXMLSDKを介して変更を適用するためのコードを記述できる可能性があります。

于 2013-01-25T20:10:51.233 に答える
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);
于 2013-01-25T19:52:55.177 に答える