C++加速解析大字符串的多个子()或等效函数调用
C++ Speeding up multiple substr() or equivalent function calls for parsing of a large string
我正在尝试解析从文件加载到内存中的大字符串。我正在用一个可变长度的滑动窗口解析DNA序列(存储为字符串)。问题是字符串太大了,需要很长时间才能遍历它们。我不知道这是否可能,但有可能以某种方式加快速度吗?
我的意思是,我预计I/O将主导我的应用程序,所以我将逐行读取改为立即将整个文件读取到内存中,但在测试我的代码后,我发现它大部分时间都在这样的循环中:
size_t currentCharNumber = 0;
int16_t windowSize = 50;
//seq is a string of length 249250621
while(seq.length() - currentLinePos < windowSize)
{
string temp = seq.substr(currentLinePos, windowSize);
//do stuff to temp
++currentLinePos;
}
将序列从文件加载到内存只需要几秒钟,但解析序列需要大约30分钟(即使在注释掉substr()调用下面的处理之后)。是我遗漏了一些增加了大量开销的东西,还是可能是由于我的数据大小?
提到我可以忽略具有ATCG以外字符的子字符串,这会有帮助吗?我的意思是,我在代码中进行过滤,但只有在从substr中获得字符串之后。
这是我第一次发帖,我的C++有点生疏。如有任何反馈,我们将不胜感激。
您可能需要考虑从使用string
来固定滑动窗口切换到使用std::deque<char>
。deque
类型针对在两端插入和删除值进行了优化,因此在这里是一个很好的候选者。您可以从将前50个字符加载到deque
开始,然后可以这样调整循环:
/* Initialize the window to the first windowSize characters. */
std::deque<char> window(seq.begin(), seq.begin() + windowSize);
/* Repeatedly process each window. */
for (size_t i = windowSize; i < seq.length(); ++i) {
/* Do something to window */
/* Drop the first character from the window, then add the next character
* of the sequence.
*/
window.pop_front();
window.push_back(seq[i]);
}
这使得构建每个窗口的时间为O(1),而不是O(k),其中k
是窗口中的字符数。这可能会显著减少运行时间,因为窗口中的字符数量相当大。
希望这能有所帮助!
您可以通过将两个指针分隔到原始字符串中来定义滑动窗口,并使用它,而不是将整个范围复制到一个单独的字符串中。如果std::string
构造是开销,请避免它。
您也可以每次重复使用相同的std::string
实例(假设窗口大小是恒定的),但它仍然会花费您一次复制操作(不过,对于较小的窗口/长度比,这可能可以忽略不计)。
对std::string::substr
的调用可能会导致过多的动态内存分配,并且至少会复制缓冲区。通常,您可以通过更改算法以使用字符串定义迭代器来减少对substr
的需求。
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- C++加速解析大字符串的多个子()或等效函数调用