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();

而且效果非常好:) 如果有人有更有效的解决方案,我会很高兴看到! :)