2016-05-17 14 views
1

Ich möchte nach meinem Code unten fragen: (Der Code unten liest grundsätzlich eine Eingabedatei namens inputVelocity.dat mit Format im Code angegeben. Der Code liest mit istringstream jeden Wert zu jedem bestimmten Arrays)ifstream, getline und istringstream langsame Leistung auf große Datei in C++

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

der Code fein passieren wird, wenn sich um 20000 Zeilen lesen, aber wenn ich die Datei in etwa 1,6 Millionen Zeilen zu ändern, wird der Code lief sehr langsam auch auf einem Server.

Ich habe Std :: Cout auf jeder getline-Schleife und es gelesen wie 5 Zeilen/Sekunde, mit etwa 1,6 Millionen Zeilen.

Ich habe einige verwandte Fragen hier gefunden, kann aber immer noch nicht verstehen, was die Problemquelle ist und wie man sie beheben kann. Jeder kann helfen? Danke.

+0

vor allem, sind Sie sicher, dass Sie drei 'for' Schleifen für jede Zeile aufrufen möchten? Wissen Sie, dass Sie Komplexität O (LINE COUNT x NX x NY x NZ) für Ihre Ladeprozedur haben? – AnatolyS

+0

@AnatolyS also meinst du das war der fall? Wie kann ich den Code verbessern? weil meine ganze Variable ein 3-dimensionaler Vektor ist. – mfakhrusy

+0

Ich kann nicht verstehen, was Sie in der While-Schleife tun. Versuchen Sie, sich selbst zu erklären, was Sie tun möchten. – AnatolyS

Antwort

0

änderte ich den Code in das:

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

Und das funktionierte wirklich gut :) Wenn jemand eine effizientere Lösung hat, wäre ich sehr froh, zu sehen! :)