stackalloc(C#参考)

stackalloc(C#参考),c#,memory,information-retrieval,text-parsing,C#,Memory,Information Retrieval,Text Parsing,我正在尝试解析130000个文档,我正在尽可能快地解析 此函数用于删除文档中的分隔符字符 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) {

我正在尝试解析130000个文档,我正在尽可能快地解析

此函数用于删除文档中的分隔符字符

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));            
}
公共静态不安全字符串StripRestAndNewlines(字符串s)
{
int len=s.长度;
char*newChars=stackalloc char[len];
char*currentChar=newChars;
对于(int i=0;i”:

案例'我认为没有delete方法。它是一个堆栈,您可以在顶部添加一些内容,然后从顶部删除内容。您不能从堆栈中间删除内容。当方法返回时,分配的内存会自动释放。 我认为当传入字符串很长时会发生stackoverflow。请使用堆内存执行此任务。只需创建一个新数组

是否有任何可供分配的删除[]

是的,什么都不做。因为它的堆栈分配,它将在方法返回时立即删除(你提到的<代码>删除[]/Cord]建议你正在类比C++,但是注意C++中没有<代码>删除[]/COD>堆栈分配的变量)。 不过,你不会走那么远,因为你的堆栈分配太多了

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

使用堆数组会更好。使用指针和
修复
可能会更好,也可能不会更好


解析文档会让您受益匪浅分块。如果可能的话,只在4KB或8kiB的中等大小段中从流中加载它们,并在出现这些块时对其进行处理。

为什么要尝试使用堆栈分配来进行此操作?假设您的文档非常大……尝试分配堆栈上字符串所需的全部内存对我来说似乎是个坏主意。我很抱歉尝试使用尽可能少的内存也是我发现的最快的方法。这就是为什么我正在寻找一种释放/删除分配的方法。如果你试图删除字符,我想知道你不会编写自己的小扩展方法来替换特定的字符
public static string ReplaceCharsAt(此字符串输入,int索引,char newChar)
通常使用更少的内存与尽可能快的速度相反。您仍然在它的末尾创建一个新字符串-因此您可以只克隆原始字符串,然后修改该字符串的固定版本。仍然堆让我变慢了,但很高兴知道我不能感谢。然后可能创建一个静态数组?您将避免实例crea如果传入的字符串太大,您将调整该数组的大小。