【问题标题】: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时努力!

标签: c++ memory-management stl


【解决方案1】:

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

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

【讨论】:

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