C++ C++;读取大文本文件
我有一个大约20GB的非常大的文本文件。 此文件包含多个文本行 我需要把这个文件分块读入内存。每个数据块都足够放入主内存 最有效的方法是什么? -读入缓冲区,然后将数据解析成CAR+的C++向量。 -逐行读取文件并放入上面的向量C++ C++;读取大文本文件,c++,performance,C++,Performance,我有一个大约20GB的非常大的文本文件。 此文件包含多个文本行 我需要把这个文件分块读入内存。每个数据块都足够放入主内存 最有效的方法是什么? -读入缓冲区,然后将数据解析成CAR+的C++向量。 -逐行读取文件并放入上面的向量 -或者其他方法?最有效的方法是将数据块或数据块读入缓冲区,而不是扫描缓冲区 I/O具有开销成本,每个请求可以获取的数据越多越好 在内存中搜索总是比一次从输入中读取一个字符更快 注意两种情况: 一行继续经过缓冲区的末尾 缓冲区没有填满 编辑1:内存映射 另一种选择是让操作
-或者其他方法?最有效的方法是将数据块或数据块读入缓冲区,而不是扫描缓冲区 I/O具有开销成本,每个请求可以获取的数据越多越好 在内存中搜索总是比一次从输入中读取一个字符更快 注意两种情况:
另一种选择是让操作系统将文件视为内存。本质上,操作系统将根据需要处理文件的块或块读取
您必须测量性能(即配置文件),以找出哪种方法更有效以及效率有多高。这只是在答案中添加一些代码:
#include <fstream>
#include <iostream>
const static size_t numToReadAtATime = 4;
int main()
{
std::ifstream s{ "filename.dat" };
while(true)
{
char nextChars[numToReadAtATime];
if(s.readsome(nextChars, numToReadAtATime) != numToReadAtATime)
break;
// dostuff with nextChars
}
}
#包括
#包括
常量静态大小\u t numToReadAtATime=4;
int main()
{
std::ifstreams{“filename.dat”};
while(true)
{
char nextChars[numToReadAtATime];
if(s.readsome(nextChars,numToReadAtATime)!=numToReadAtATime)
打破
//用nextChars的dostuff
}
}
我认为您没有20GB的文本文件。除此之外,为什么不尝试任何一种方法并对其进行分析呢。或者,如果它是一次性的,就让它在周末运行,例如“C++字符向量[]”-请告诉我,您刚才输入错误,并且实际上知道std::string
,std::vector
,以及char[]
的缺点……我只是认为字符数组比std::string快。对于I/O缓冲区,不要费心于std::vector
或std::string
。使用字符数组。另外,分配一次并重新使用。谢谢。现在我有了更好的办法。std::ifstream
已经在做缓冲了。在上面添加另一层缓冲是没有意义的。这不是缓冲的问题,而是缓冲的大小。例如,一个自缓冲方案将允许512MB的缓冲区,而我不相信std::ifstream
会使用那么大的缓冲区。是的,std::ifstream
上游有更多的缓冲区。在一般情况下,std::ifstream缓冲区是通用的,以获得最佳性能(因此在特定情况下可能更好)。但只要给它一个更大的缓冲。无需实现自己的缓冲区。