从字符串流中删除(免费)元素

Posted

技术标签:

【中文标题】从字符串流中删除(免费)元素【英文标题】:delete (free) elements from stringstream 【发布时间】:2014-11-18 12:34:18 【问题描述】:

我正在尝试处理大量数据。我有一个std::stringstream,它由一个大缓冲区(大约 0.5g)初始化,我正在从中读取:

fread(buffer, sizeof(char), fileSize, infile);
std::stringstream stream(buffer);
free(buffer)

buffer 很大) 现在我正在通过以下方式阅读这个std::stringstream

while(std::getline(stream, line))

  do something with that line...

因为这个流是由一个大缓冲区初始化的,并且我正在使用 STL 容器将来自 line 的数据存储在这个循环中,所以内存不足。

有没有办法从 std::stringstream 中释放字节,因为我正在通过解析循环为稍后使用的其他容器释放内存?

【问题讨论】:

只是出于兴趣,你为什么不直接使用std::fstream 因为我想将文件导入内存而不是逐行读取,所以我选择先将其读入缓冲区,然后像字符串流一样访问它 对我来说听起来有点像过早优化;) 使用 fstream 真的太慢了​​吗?我唯一的其他建议是考虑像mmap 这样的低级东西,或者看看编写你自己的字符串缓冲区类,当通过正常的istream 机制读取时,它会自行处理......但这似乎很多当你可以使用fstream时努力! 【参考方案1】:

由于std::istringstream 使用std::string 存储其数据,buffer 的内容被复制 到存储在流中的字符串。因此,要回答您的问题,是的,您可以在创建和初始化字符串流后立即释放缓冲区。

不过,一个更有趣的问题是,为什么要使用 C 文件处理而不是直接使用 C++ 流?为什么将整个文件读入内存,如果它这么大,为什么不读大块(比如一行或多行)?或者为什么不改用memory map the file?

【讨论】:

我会稍微回答你的问题,但我的问题不是我是否可以释放缓冲区,我知道我可以......我的问题是我可以在阅读后从该字符串流中释放部分吗成行 1.我喜欢 C 风格的文件处理,因为我现在从 c 迁移到 c++,所以它是前世的剩菜:) 2.当我尝试逐行阅读时,它的工作速度真的很慢 3.我不熟悉还 @DimaShifrin 啊,不,你不能那样做,因为你不拥有缓冲区。并且不可能释放部分内存。可能会获取字符串,并从当前位置创建一个子字符串并再次将其设置在流缓冲区中,但这比它真正值得做的工作更多。我真的建议您查看文件的内存映射,然后您可以像普通指针一样读取文件,不幸的是您不能使用漂亮的流功能(如std::getline)但它可以在其他方面更简单和更有效. 文件的内存映射对我有用!并在此过程中学到了一些新东西,谢谢!

以上是关于从字符串流中删除(免费)元素的主要内容,如果未能解决你的问题,请参考以下文章

stringstream字符串流的妙用

从字符串读取到字符串流

无法从字符串流接收信息

C++学习50 对字符串流的读写

有可能以这种方式串流吗?从字符串转换为int?

Java基础IO类之字符串流(查字符串中的单词数量)与管道流