当文件变大时,为什么我的内存耗尽?

时间:2016-10-18 08:51:47

标签: c# .net wpf winforms cryptography

所以我得到的错误就是这个。

  

未处理的类型' System.OutOfMemoryException'发生了   在mscorlib.dll中

我以前从未遇到过这个错误,而且我已经在Google上查了过来 我有一个64位系统 我有16GB的RAM。

有些人说我需要在我的项目属性中将平台目标设置为x64,但不会这样做只有64位系统才能运行这个应用程序吗?

public static string RC4(string input, string key)
{
    StringBuilder result = new StringBuilder();
    int x, y, j = 0;
    int[] box = new int[256];

    for (int i = 0; i < 256; i++)
    {
        box[i] = i;
    }

    for (int i = 0; i < 256; i++)
    {
        j = (key[i % key.Length] + box[i] + j) % 256;
        x = box[i];
        box[i] = box[j];
        box[j] = x;
    }

    for (int i = 0; i < input.Length; i++)
    {
        y = i % 256;
        j = (box[y] + j) % 256;
        x = box[y];
        box[y] = box[j];
        box[j] = x;

        result.Append((char)(input[i] ^ box[(box[y] + box[j]) % 256]));
    }
    return result.ToString(); //This would be the line throwing me the error.
}

因为每一秒我都会将新的文本从键盘钩子附加到文本文件中。所以我可以说我在第一秒后键入abc,如果我在下一秒输入def它会追加它。这一切都发生在计时器滴答声中,所以它非常直接。 每当文本文件达到大约350 000KB时,它就会抛出该错误。

1 个答案:

答案 0 :(得分:2)

即使在x64上,允许的单个对象的大小也是有限的。实际限制并不重要,取决于配置,但结果是,在处理大量数据时,您应该通过数据(通常通过Stream)读取数据,一次处理数据块。永远不要试图将整个东西放在记忆中。这同样适用于输入和输出。

现在,如果您设法将整个内容加载到input,那么您很幸运;但StringBuilder故意超大,因此它不必一直保持分配。您可能能够&#34;修复&#34;通过告诉StringBuilder构造函数中需要的正确数量的字符来代码,但这只是一个临时的hack,可以让你处理稍大的数据。 真正的修复不会尝试在一个块中处理大量数据。