我正在尝试从一个非常大的文本文件中读取两列,它是一个Web图形,如下所示:(除了它有4000万行)。
1 2
1 3
2 1 ...
所以我想从txt文件中读取myArray [mysize] [2],我使用了代码:
ifstream file("web-graph.txt");
if(file.is_open())
{
for(int i = 0; i < mysize; i++)
{
file >> myArray[i][0];
file >> myArray[i][1];
}
}
问题是读取这么大的文件需要很长时间。那么有没有其他方法从文件中读取不花费这么多时间?
答案 0 :(得分:0)
是的,可能会受到分析,但你不会喜欢这个答案。
如果使文件变小,可能会更快阅读。怎么样?将其保存为二进制,而不是文本。请注意,这将阻止您使用漂亮的高级流媒体运营商。
你将不得不使用较低级别的东西,这可能会给你更多的加速。
如果你问自己为什么要将整个文件读入内存可能会更好。同样,如果你创建文件二进制文件,你可以seek
到你想要的特定行。
如果您正在对文件执行计算,也许您可以随时或以块的形式处理它。
答案 1 :(得分:0)
是的,你肯定是以缓慢(但很漂亮)的方式做到这一点。你有两个选择更快:
如果(你有足够的记忆力) { 将整个文件读入内存,然后然后解析文件 }
否则 { 一次将大块文件读入内存,然后解析文件 }
无论哪种方式,加载看起来像这样......
std::ifstream is(filename);
is.seekg(0, std::ios::end);
auto length = is.tellg();
std::string buffer;
if(length > 0)
{
buffer.resize(static_cast<std::string::size_type>(length));
is.seekg(0);
is.read(&buffer.front(), length);
}
然后你会把它放在一个字符串流......
std::stringstream ss(buffer);
并解析它,可能正是你之前的做法......
for(int i = 0; i < mysize; i++)
{
ss >> myArray[i][0];
ss >> myArray[i][1];
}