从字符串流中删除(免费)元素
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
)但它可以在其他方面更简单和更有效.
文件的内存映射对我有用!并在此过程中学到了一些新东西,谢谢!以上是关于从字符串流中删除(免费)元素的主要内容,如果未能解决你的问题,请参考以下文章