簡體   English   中英

C#:內存不足異常

[英]C#: Out of memory Exception

我已經編寫了一個控制台應用程序

   Int64 sum = 0;
        int T = Convert.ToInt32(Console.ReadLine());
        Int64[] input = new Int64[T];
        for (int i = 0; i < T; i++)
        {
            input[i] = Convert.ToInt32(Console.ReadLine());
        }
        for (int i = 0; i < T; i++)
        {
            int[,] Matrix = new int[input[i], input[i]];
            sum = 0;
            for (int j = 0; j < input[i]; j++)
            {
                for (int k = 0; k < input[i]; k++)
                {

                    Matrix[j, k] = Math.Abs(j - k);
                    sum += Matrix[j, k];
                }
            }
            Console.WriteLine(sum);
        }

當我輸入為

2
1
999999

它給出Out of memory exception 你能幫忙嗎?

查看您要分配的內容:

input[]被分配為2個元素(16個字節)-不用擔心

但是隨后您輸入值: 1999999並在循環的第一次迭代中嘗試分配

Matrix [1,1] = 4個字節-再也不用擔心,

但是您第二次嘗試分配

矩陣[999999,999999]

這是4 * 10e12字節,即使磁盤上有交換空間,也肯定超出了計算機的容量。

我懷疑這不是您真正想要分配的(無論如何,您永遠都無法填充或操縱那么多元素……)

如果您只是嘗試按照原始代碼進行計算,則無需分配或使用該數組,因為您只存儲一個值並立即使用該值,然后就不再使用它。

Int64 sum = 0;
int T = Convert.ToInt32(Console.ReadLine());

Int64[] input = new Int64[T];

for (int i = 0; i < T; i++)
    input[i] = Convert.ToInt32(Console.ReadLine());

for (int i = 0; i < T; i++)
{
    // int[,] Matrix = new int[input[i], input[i]];
    sum = 0;

    for (int j = 0; j < input[i]; j++)
        for (int k = 0; k < input[i]; k++)
            {
                //Matrix[j, k] = Math.Abs(j - k);
                //sum += Matrix[j, k];
                sum += Math.Abs(j - k);
            }
    Console.WriteLine(sum);
}

但是現在要當心-一萬億美元將永遠需要計算-它不會轟炸,但是您可能想要休假,結婚並生孩子,然后才能預期結果。

當然,您可以執行以下方法來求和:

for (int i = 0; i < T; i++)
{
    sum = 0;

    for (int j = 1, term = 0; j < input[i]; j++)
    {
        term += j;
        sum += term * 2;
    }

    Console.WriteLine(sum);
}

所以現在的計算是O(n)而不是O(n ^ 2)

而且,如果您需要知道Matrix[x,y]的值,可以使用簡單表達式Math.Abs(x - y)因此無需存儲該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM