นี่คือรหัสของฉัน:
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
ข้อยกเว้น: ข้อยกเว้นประเภท 'System.OutOfMemoryException' ถูกโยนทิ้ง
ฉันมีหน่วยความจำ 4GB ในเครื่องนี้ 2.5GB ฟรีเมื่อฉันเริ่มการทำงานนี้มีพื้นที่ว่างเพียงพอบนพีซีอย่างชัดเจนที่จะจัดการกับตัวเลขสุ่ม 762mb ของ 100000000 ฉันต้องการจัดเก็บตัวเลขสุ่มให้ได้มากที่สุดเท่าที่จะเป็นไปได้ที่มีหน่วยความจำ เมื่อฉันไปผลิตจะมี 12GB บนกล่องและฉันต้องการใช้ประโยชน์จากมัน
CLR บังคับให้ฉันใช้หน่วยความจำสูงสุดเริ่มต้นหรือไม่ และฉันจะขอเพิ่มได้อย่างไร?
อัปเดต
ฉันคิดว่าการแบ่งสิ่งนี้ออกเป็นชิ้นเล็ก ๆ และการเพิ่มความต้องการหน่วยความจำของฉันทีละน้อยจะช่วยได้หากปัญหาเกิดจากการแยกส่วนหน่วยความจำแต่ฉันไม่สามารถผ่านขนาด ArrayList ทั้งหมดที่มีขนาด 256mb ไม่ว่าฉันจะปรับแต่ง blockSizeก็ตาม
private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();
private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
for (int i = 0; i < numberOfRandomNumbers; i++) {
ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));
}
}
จากวิธีการหลักของฉัน:
int blockSize = 1000000;
while (true) {
try
{
AddNDRandomNumbers(blockSize);
}
catch (System.OutOfMemoryException ex)
{
break;
}
}
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;