stackalloc(C#参考)
我正在尝试解析130000个文档,我正在尽可能快地解析 此函数用于删除文档中的分隔符字符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) {
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如果传入的字符串太大,您将调整该数组的大小。