stackalloc(C#参考)

时间:2015-12-03 17:11:25

标签: c# memory information-retrieval text-parsing

我试图解析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

是否有任何删除[]免费的分配?

谢谢!

2 个答案:

答案 0 :(得分:3)

  

是否有任何删除[]免费的分配?

是的,什么都不做。由于它的堆栈分配,一旦方法返回就会立即删除(你提到delete[]表明你正在绘制类比C ++,但请注意,在C ++中你没有delete[]堆栈分配的变量)。

你不会那么远,因为你的筹码分配太多了。

stackalloc使用非常有限。它往往比仅使用堆内存慢,除非您将它用作fixed的替代方案,或者在允许不同线程同时分配大型数组的少数情况下使用它。它只适合在外部使用小于几千字节的数组。

使用堆数组会更好。您可能会或可能不会更好地使用指针和fixed

以块的形式解析文档会更好。如果可能的话,只能在4kiB或8kiB的中等大小的段中从流中加载它们,并处理每个这样的块。

答案 1 :(得分:2)

我认为没有删除方法。它是一个堆栈,你可以在顶部添加一些东西,并从顶部删除东西。你不能从堆栈中间删除东西。方法返回时,将自动释放已分配的内存。 我认为当传入的字符串很长时会发生stackoverflow。将堆内存用于此任务。只需创建一个新数组。