c# - 为什么当文件变大时我的内存就会耗尽?

标签 c# .net wpf winforms cryptography

所以我得到的错误是这样的。

An unhandled exception of type 'System.OutOfMemoryException' occurred in mscorlib.dll

我以前从未遇到过此错误,我已在 Google 上查找过该错误。
我有 64 位系统。
我有 16GB 内存。

有人说我需要在项目属性中将平台目标设置为 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.
}

因为每一秒都会将新文本从键盘 Hook 附加到文本文件中。因此,假设我在第一秒输入 abc 它将附加该内容,现在如果我在下一秒输入 def 它将附加该内容。这一切都发生在计时器滴答内,所以它非常简单。 每当文本文件达到大约 350 000KB 时,它就会抛出该错误。

最佳答案

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

现在,如果您成功地将整个内容加载到input中,那么您很幸运;但 StringBuilder 故意过大,这样它就不必一直进行分配。您可能可以通过告诉StringBuilder构造函数中所需的正确字符数来“修复”您的代码,但这只是一个临时技巧,可以让您处理稍大的数据。 真正的解决方法是不要尝试在单个 block 中处理大量数据。

关于c# - 为什么当文件变大时我的内存就会耗尽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40103699/

相关文章:

.net - .net 中 en-CA 的短日期格式

c# - WPF 中的快速像素绘制

c# - 如何在.net 项目中使用非托管dll?

c# - asp.net mvc c# with sql 没有 ORM

c# - 如何绘制带有标记(线段连接点)的路径?

c# - 在 C# 中将大十进制值舍入到小十进制值

c# - 如何将 IsChecked 绑定(bind)到 ViewModel 子类

c# - MediaElement 支持哪些格式?

c# - 从一页滑动到另一页

C# MySQL 事务不工作