マルチスレッドを使用して EPPlus を並列化しようとしていました。各スレッドが 10 列 26 行の 1000 枚のシートを生成する 20 のスレッドを生成しようとしました。プログラムは最大 1.8 GB のメモリを消費し、「メモリ不足」例外をスローしました。
これを解決する方法を知っている人はいますか?
ありがとうございました。
マルチスレッドを使用して EPPlus を並列化しようとしていました。各スレッドが 10 列 26 行の 1000 枚のシートを生成する 20 のスレッドを生成しようとしました。プログラムは最大 1.8 GB のメモリを消費し、「メモリ不足」例外をスローしました。
これを解決する方法を知っている人はいますか?
ありがとうございました。
これは、マルチスレッドで実行しようとした単純なプログラムですが、「メモリ不足」の例外が発生しました。
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++
}
}
OS が 32 ビットの場合、1 つの実行可能ファイルは最大で 2GB を使用できます。実際、1.8GB はこのしきい値に非常に近いです。異なるプロセッサ アフィニティを使用して Paralle.ForEach を使用する場合は、マシンでより多くの RAM を備えた 64 ビット OS を使用するか、より少ないスレッドを生成するか、より少ないスレッドを使用します。