gpt4 book ai didi

c# - 从一个长字符串(300 万个字符)中读取大量(100 万个)子字符串(100 个字符宽)

转载 作者:行者123 更新时间:2023-11-30 22:30:13 24 4
gpt4 key购买 nike

如何在 C# 中高效地从超过 300 万个字符的字符串中提取 100 万个子字符串?我编写了一个程序,其中涉及从具有 300 万个字符的字符串中读取长度为 100 的随机 DNA 读数(来自随机位置的子字符串)。有100万这样的阅读。目前我运行了一个运行 100 万次的 while 循环,并从具有 300 万个字符的字符串中读取了一个 100 个字符长度的子字符串。这需要很长时间。我该怎么做才能更快地完成这项工作?

这是我的代码,len 是原始字符串的长度,在本例中为 300 万,它可能低至 50,这就是为什么要在 while 循环中进行检查。

while(i < 1000000 && len-100> 0) //len is 3000000
{
int randomPos = _random.Next()%(len - ReadLength);
readString += all.Substring(randomPos, ReadLength) + Environment.NewLine;
i++;


}

最佳答案

使用 StringBuilder 组装字符串将使您的处理量增加 600 倍(因为它避免了每次附加到字符串时重复创建对象。

循环前(初始化容量避免在 StringBuilder 中重新创建支持数组):

StringBuilder sb = new StringBuilder(1000000 * ReadLength);

在循环中:

sb.Append(all.Substring(randomPos, ReadLength) + Environment.NewLine);

循环后:

readString = sb.ToString();

使用 char 数组而不是字符串来提取值可以再提高 30%,因为您可以避免在调用 Substring() 时创建对象:

循环前:

char[] chars = all.ToCharArray();

在循环中:

sb.Append(chars, randomPos, ReadLength);
sb.AppendLine();

编辑(不使用 StringBuilder 并在 300 毫秒内执行的最终版本):

char[] chars = all.ToCharArray();    
var iterations = 1000000;
char[] results = new char[iterations * (ReadLength + 1)];
GetRandomStrings(len, iterations, ReadLength, chars, results, 0);
string s = new string(results);

private static void GetRandomStrings(int len, int iterations, int ReadLength, char[] chars, char[] result, int resultIndex)
{
Random random = new Random();
int i = 0, index = resultIndex;
while (i < iterations && len - 100 > 0) //len is 3000000
{
var i1 = len - ReadLength;
int randomPos = random.Next() % i1;

Array.Copy(chars, randomPos, result, index, ReadLength);
index += ReadLength;
result[index] = Environment.NewLine[0];
index++;

i++;
}
}

关于c# - 从一个长字符串(300 万个字符)中读取大量(100 万个)子字符串(100 个字符宽),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9801801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com