ifstream,getline和istringstream在c ++中对大文件的性能降低

时间:2016-05-17 10:11:52

标签: c++ ifstream getline istringstream

我想询问下面的代码:(下面的代码基本上读取了一个名为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行/秒,大约有160万行。

我在这里找到了一些相关的问题,但仍然无法理解问题的来源是什么以及如何解决它。有人可以帮忙吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

我将代码更改为:

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

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