所以我得到的错误是这样的。
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/