将文本文件中的单个字符存储到向量 C++ 中时的 std::bad_alloc

Posted

技术标签:

【中文标题】将文本文件中的单个字符存储到向量 C++ 中时的 std::bad_alloc【英文标题】:std::bad_alloc when storing single characters from a text file into a vector C++ 【发布时间】:2018-04-16 04:46:28 【问题描述】:

所以我的目标是从文件中读取和存储单个字符(它们是基因组序列)。这些文件非常大,基本上看起来像这样:

>gi|188033402|emb|CU859091.1| A BAC library has been constructed from PN40024...
AGCTCCTTTTTAAAACAACATTCAAGAAATTGGAGTTTGGCATTTTTACAAAGAGCATATTCAGCTCTGG
GAAGTATTTCTTGAGCAAAGAGGAGCGAAAATAGATCCTAAATGTTCCCCAGATTTTCCCCAGATTCCAA

以“ >”字符开头的行可以完全忽略。所以基本上我只想要“AGCTCCTTTTTA...”部分。

我的代码适用于较小的文件,但在处理较大的文件时会崩溃。我试图弄清楚这里的内存问题是什么以及如何解决它。我运行文件时遇到的错误是:

terminate called after throwing an instance of 'std::bad_alloc'
   what(): std::bad_alloc
Aborted (core dumped)

这是我读取单个字符并将它们存储到向量中的简化代码:

int main(int argc, char * argv[])

   ifstream file (argv[1]);

   vector<char> sequenceA; // to store the single characters
   string line; // to grab lines from the file
   char c; // to grab the single character from the file

   // go through the file
   while(getline(file,line))
   
      //store the line
      stringstream stream(line);

      // go through and grab each single character in the line
      while(stream.get(c))
      
         if(c == '>')
         
            // break and continue to the next line
            break;
         
         else
         
            // add the character to the list
            sequenceA.push_back(c);
         
      
   

我正在查看 *** 上的其他“std::bad_alloc”帖子,但似乎找不到可以帮助我解决问题的帖子,因此非常感谢您的帮助!如果你不知道,我对编程还是很陌生,很感激你的解释。

非常感谢!

【问题讨论】:

你从来没有提到这些文件有多大。 在例外之前你能获得多大的规模是否有任何押韵或理由?优化:通过一些工作,您可以将if(c == '&gt;') 拉出while 循环。 if (line.size() &amp;&amp; line[0] != '&gt;') /* stringstream etc... */ 之类的东西就在 while(getline(file,line) 之后。 @PaulMcKenzie 对此感到抱歉!不幸的是,我不知道文件的确切大小......我所知道的是,如果您尝试将它们打印到控制台,您将等待几分钟才能完成。内存足够大,似乎是个问题。抱歉,我不能给你更多细节。 @user4581301 感谢您的优化提示!我会尝试清理我的代码。另外,我不确定在异常之前我有多大……有没有办法让我找出来? (对不起,如果这是一个愚蠢的问题,我正在努力哈哈......) 只需增加一个计数器并用try / catch 包围您的代码。当catch 出现时,检查计数器。 【参考方案1】:

这意味着程序最终会要求一个足够大的连续内存块,系统无法提供它。

如果你坚持你的方法,一个快速的解决方法可能是使用deque而不是vector

【讨论】:

以上是关于将文本文件中的单个字符存储到向量 C++ 中时的 std::bad_alloc的主要内容,如果未能解决你的问题,请参考以下文章

将文本文件中的数据提取到结构中

Rust 是不是将添加到向量中的单个项目装箱?

C++ 将单个元素移动到向量中的新位置的最简单最有效的方法

将文件中的双值数字读入 C++ 中的向量并访问它们的值

在向量中存储重复字符串时节省内存?

如何将文件存储到包含 C++ 中的类对象的向量中?