0

マルチスレッドを使用して EPPlus を並列化しようとしていました。各スレッドが 10 列 26 行の 1000 枚のシートを生成する 20 のスレッドを生成しようとしました。プログラムは最大 1.8 GB のメモリを消費し、「メモリ不足」例外をスローしました。

これを解決する方法を知っている人はいますか?

ありがとうございました。

4

2 に答える 2

0

これは、マルチスレッドで実行しようとした単純なプログラムですが、「メモリ不足」の例外が発生しました。

               class Program
                {
                    private static int fileID=0;
                    static void Main(string[] args)
                    {
                        List<Thread> threadPool = new List<Thread>();
                        int threadCount = 20;


                        for(int i=0;i<threadCount;i++)
                        {
                            System.Threading.Thread reportThread = new System.Threading.Thread(() => GenerateThousandSheets());
                            threadPool.Add(reportThread);
                            reportThread.Start();
                        }

                        threadPool.ForEach(x => x.Join());
                        Console.WriteLine("Finished!");
                        Console.ReadKey();
                    }


                    private static void GenerateThousandSheets()
                    {
                        FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample6.xlsx");
                        ExcelPackage pck = new ExcelPackage(newFile);

                        ExcelWorksheet ws = pck.Workbook.Worksheets[0];

                        for(int x= 0;x<1000;x++)
                        {
                            int newPosition = ws.Index + x;
                            pck.Workbook.Worksheets.Copy("Template","Sheet"+x);
                        }

                        FileInfo outputFile = new FileInfo(outputDir.FullName +fileID+ "-output.xlsx");
                        pck.SaveAs(outputFile);
                        counter++
                    }
                }
于 2013-04-17T08:26:03.413 に答える
0

OS が 32 ビットの場合、1 つの実行可能ファイルは最大で 2GB を使用できます。実際、1.8GB はこのしきい値に非常に近いです。異なるプロセッサ アフィニティを使用して Paralle.ForEach を使用する場合は、マシンでより多くの RAM を備えた 64 ビット OS を使用するか、より少ないスレッドを生成するか、より少ないスレッドを使用します。

于 2018-05-03T09:15:23.700 に答える