string lineValue;
ifstream myFile("file.txt");
if (myFile.is_open()) {
//getline(myFile, lineValue);
//cout<<lineValue;
while (getline(myFile, lineValue)) {
cout << lineValue << '\n';
}
myFile.close();
}
else cout << "Unable to open file";
txt
档案格式是这样的
0 1
1 2
2 3
3 4
4 5
5 5
6 6
7 7
8 8
9 9
上面的代码是逐行读取文本文件中的数据,但文本文件大小非常大(10GB)。 那么如何以较少的I / O和高效率从块/块中读取文件中的数据?
答案 0 :(得分:1)
如果您正在考虑阅读大量数据,那么您将使用一种称为缓冲的技术。但是,ifstream已经提供缓冲,所以我的第一步是看看你是否可以让ifstream为你完成这项工作。
我会设置比ifstream中的默认缓冲区大得多的缓冲区。像
这样的东西const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);
std::ifstream is;
is.rdbuf()->pubsetbuf(buffer.get(), BUFSIZE);
is.open(filename.c_str());
const int LINESIZE = 256;
char line[LINESIZE];
if (is) {
for (;;) {
is.getline(line, LINESIZE);
// check for errors and do other work here, (and end loop at some point!)
}
}
is.close();
确保缓冲区与使用它的ifstream对象一样长。
如果您发现速度仍然不足,那么您可以尝试使用ifstream :: read读取数据块。不能保证它会更快,你必须时间和比较选项。你使用ifstream :: read这样的东西。
const int BUFSIZE = 65536;
std::unique_ptr<char> buffer(new char[BUFSIZE]);
is.read(buffer.get(), BUFSIZE);
你必须注意编写代码来调用ifstream.read,注意处理输入的“行”可能在连续的块中被分割(甚至跨越两个以上的块,这取决于你的数据)和缓冲区大小)。这就是为什么你想修改ifstream的缓冲区,因为你是第一个选择。
答案 1 :(得分:0)
当且仅当文本行的长度相同时,您只需使用std::istream::read();
读取文件即可。
要读取的块的大小为:
block_size = text_line_length * number_of_text_lines;
如果你足够勇敢地处理更多的复杂性或者你的文本行不等长,你可以在向量中读取任意长度的字符并处理向量中的文本。
当文本行溢出块时,复杂性开始发挥作用。考虑处理块的末尾只有部分句子可用的情况。