ifstream、getline 和 istringstream 在 C++ 中对大文件的性能降低
ifstream, getline, and istringstream slow performance on big file in c++
我想问一下我的下面的代码:(下面的代码基本上读取了一个名为 inputVelocity.dat 的输入文件,其格式在代码中规定。代码使用 istringstream 读取以将每个值传递给每个特定的数组)
std::ifstream inputVelocity("input/inputVelocity.dat");
std::string lineInputVelocity;
while (std::getline(inputVelocity, lineInputVelocity)) {
std::istringstream issVelocity(lineInputVelocity);
double a, b, c, d, e;
if (!(issVelocity >> a >> b >> c >> d >> e)) {
std::cout << "ISS ERROR" << std::endl;
}
for (int k=0; k<=nz+1; k++) {
for (int j=0; j<=ny+1; j++) {
for (int i=0; i<=nx+1; i++) {
ux[i][j][k] = a;
uy[i][j][k] = b;
uz[i][j][k] = c;
pressure[i][j][k] = d;
temperature[i][j][k] = e;
}
}
}
}
inputVelocity.close();
代码在读取大约 20000 行时没有问题,但是当我将文件更改为大约 160 万行时,代码 运行 即使在服务器上也非常慢。
我在每个 getline 循环上做了 std::cout,它看起来像 5 lines/second,大约有 160 万行。
我在这里找到了一些相关的问题,但仍然无法理解问题的根源是什么以及如何解决它。任何人都可以帮忙吗?
谢谢。
我把代码改成这样:
std::ifstream inputVelocity("input/inputVelocity.dat");
std::string lineInputVelocity;
int getI, getJ, getK;
getI = 0;
getJ = 0;
getK = 0;
while (std::getline(inputVelocity, lineInputVelocity)) {
std::istringstream issVelocity(lineInputVelocity);
double a, b, c, d, e;
if (!(issVelocity >> a >> b >> c >> d >> e)) {
std::cout << "ISS ERROR" << std::endl;
}
std::cout << getI << " " << getJ << " " << getK << std::endl;
ux[getI][getJ][getK] = a;
uy[getI][getJ][getK] = b;
uz[getI][getJ][getK] = c;
pressure[getI][getJ][getK] = d;
temperature[getI][getJ][getK] = e;
getK = getK + 1;
if (getK == nz+2) {
getJ = getJ + 1;
getK = 0;
}
if (getJ == ny+2) {
getI = getI + 1;
getJ = 0;
}
}
inputVelocity.close();
而且效果非常好:)
如果有人有更有效的解决方案,我会很高兴看到! :)
我想问一下我的下面的代码:(下面的代码基本上读取了一个名为 inputVelocity.dat 的输入文件,其格式在代码中规定。代码使用 istringstream 读取以将每个值传递给每个特定的数组)
std::ifstream inputVelocity("input/inputVelocity.dat");
std::string lineInputVelocity;
while (std::getline(inputVelocity, lineInputVelocity)) {
std::istringstream issVelocity(lineInputVelocity);
double a, b, c, d, e;
if (!(issVelocity >> a >> b >> c >> d >> e)) {
std::cout << "ISS ERROR" << std::endl;
}
for (int k=0; k<=nz+1; k++) {
for (int j=0; j<=ny+1; j++) {
for (int i=0; i<=nx+1; i++) {
ux[i][j][k] = a;
uy[i][j][k] = b;
uz[i][j][k] = c;
pressure[i][j][k] = d;
temperature[i][j][k] = e;
}
}
}
}
inputVelocity.close();
代码在读取大约 20000 行时没有问题,但是当我将文件更改为大约 160 万行时,代码 运行 即使在服务器上也非常慢。
我在每个 getline 循环上做了 std::cout,它看起来像 5 lines/second,大约有 160 万行。
我在这里找到了一些相关的问题,但仍然无法理解问题的根源是什么以及如何解决它。任何人都可以帮忙吗? 谢谢。
我把代码改成这样:
std::ifstream inputVelocity("input/inputVelocity.dat");
std::string lineInputVelocity;
int getI, getJ, getK;
getI = 0;
getJ = 0;
getK = 0;
while (std::getline(inputVelocity, lineInputVelocity)) {
std::istringstream issVelocity(lineInputVelocity);
double a, b, c, d, e;
if (!(issVelocity >> a >> b >> c >> d >> e)) {
std::cout << "ISS ERROR" << std::endl;
}
std::cout << getI << " " << getJ << " " << getK << std::endl;
ux[getI][getJ][getK] = a;
uy[getI][getJ][getK] = b;
uz[getI][getJ][getK] = c;
pressure[getI][getJ][getK] = d;
temperature[getI][getJ][getK] = e;
getK = getK + 1;
if (getK == nz+2) {
getJ = getJ + 1;
getK = 0;
}
if (getJ == ny+2) {
getI = getI + 1;
getJ = 0;
}
}
inputVelocity.close();
而且效果非常好:) 如果有人有更有效的解决方案,我会很高兴看到! :)