所以我得到的错误就是这个。
未处理的类型' 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时,它就会抛出该错误。
答案 0 :(得分:2)
即使在x64上,允许的单个对象的大小也是有限的。实际限制并不重要,取决于配置,但结果是,在处理大量数据时,您应该通过数据(通常通过Stream
)读取数据,一次处理数据块。永远不要试图将整个东西放在记忆中。这同样适用于输入和输出。
现在,如果您设法将整个内容加载到input
,那么您很幸运;但StringBuilder
故意超大,因此它不必一直保持分配。您可能能够&#34;修复&#34;通过告诉StringBuilder
构造函数中需要的正确数量的字符来代码,但这只是一个临时的hack,可以让你处理稍大的数据。 真正的修复不会尝试在一个块中处理大量数据。