我试图解析130,000个文档,并且我尽可能快地尝试这样做。
此函数用于删除Document中的分隔符char。
public static unsafe string StripRestAndNewlines(string s)
{
int len = s.Length;
char* newChars = stackalloc char[len];
char* currentChar = newChars;
for (int i = 0; i < len; ++i)
{
char c = s[i];
switch (c)
{
case ',':
case '.':
case ':':
case ';':
case '-':
case '>':
case '<':
case '/':
case '\\':
case '?':
case '"':
case '*':
case '&':
case '_':
case '+':
case '@':
case '[':
case ']':
case '!':
case '=':
case '%':
case '#':
continue;
default:
*currentChar++ = c;
break;
}
}
return new string(newChars, 0, (int)(currentChar - newChars));
}
但运行程序2分钟后停止并且我
system.StackOverflowException
是否有任何删除[]免费的分配?
谢谢!
答案 0 :(得分:3)
是否有任何删除[]免费的分配?
是的,什么都不做。由于它的堆栈分配,一旦方法返回就会立即删除(你提到delete[]
表明你正在绘制类比C ++,但请注意,在C ++中你没有delete[]
堆栈分配的变量)。
你不会那么远,因为你的筹码分配太多了。
stackalloc
使用非常有限。它往往比仅使用堆内存慢,除非您将它用作fixed
的替代方案,或者在允许不同线程同时分配大型数组的少数情况下使用它。它只适合在外部使用小于几千字节的数组。
使用堆数组会更好。您可能会或可能不会更好地使用指针和fixed
。
以块的形式解析文档会更好。如果可能的话,只能在4kiB或8kiB的中等大小的段中从流中加载它们,并处理每个这样的块。
答案 1 :(得分:2)
我认为没有删除方法。它是一个堆栈,你可以在顶部添加一些东西,并从顶部删除东西。你不能从堆栈中间删除东西。方法返回时,将自动释放已分配的内存。 我认为当传入的字符串很长时会发生stackoverflow。将堆内存用于此任务。只需创建一个新数组。