【发布时间】:2016-03-08 10:17:25
【问题描述】:
我正在尝试解析 130,000 个文档,并且我正在尝试尽可能快地做到这一点。
此函数用于删除文档中的分隔符。
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
是否有任何 delete[] 的 free 用于分配?
谢谢!
【问题讨论】:
-
为什么你要为此使用堆栈分配?大概您的文档非常大...尝试分配堆栈上字符串所需的全部内存对我来说似乎是个坏主意。
-
我正在尝试使用尽可能少的内存,这也是我找到的最快的方法。这就是为什么我正在寻找一种方法来释放/删除分配。
-
如果您尝试删除字符,我想知道您不会编写自己的小扩展方法来替换特定字符
public static string ReplaceCharsAt(this string input, int index, char newChar) -
通常使用更少的内存与尽可能快的速度相反。
-
嗯,你仍然在它的末尾创建一个新字符串 - 所以你可以克隆原始字符串,然后修改它的固定版本。
标签: c# memory information-retrieval text-parsing