X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=70c0a7806c2902b73f20601ff1fda5b330aa8c10;hb=cdf9083dc32543cc640e72e9ca3aee0323cbad45;hp=07d7f0f957859225727e598a0ebba660efe07b7c;hpb=191ae1be0679d5cf4eda950b3b1bf26fb7dd503d;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index 07d7f0f..70c0a78 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -423,6 +423,21 @@ int DistanceCommand::execute(){ else { driver(0, numSeqs, outputFile, "square"); } }else{ //you have multiple processors + unsigned long int numDists = 0; + + if (output == "square") { + numDists = numSeqs * numSeqs; + }else { + for(int i=0;i processors) { break; } + } + } + } + + if (numDists < processors) { processors = numDists; } + for (int i = 0; i < processors; i++) { lines.push_back(new linePair()); if (output != "square") { @@ -432,19 +447,10 @@ int DistanceCommand::execute(){ lines[i]->start = int ((float(i)/float(processors)) * numSeqs); lines[i]->end = int ((float(i+1)/float(processors)) * numSeqs); } + //cout << i << '\t' << lines[i]->start << '\t' << lines[i]->end << endl; } createProcesses(outputFile); - - map::iterator it = processIDS.begin(); - rename((outputFile + toString(it->second) + ".temp").c_str(), outputFile.c_str()); - it++; - - //append and remove temp files - for (; it != processIDS.end(); it++) { - m->appendFiles((outputFile + toString(it->second) + ".temp"), outputFile); - remove((outputFile + toString(it->second) + ".temp").c_str()); - } } #else //ifstream inFASTA; @@ -526,7 +532,7 @@ int DistanceCommand::execute(){ void DistanceCommand::createProcesses(string filename) { try { #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - int process = 0; + int process = 1; processIDS.clear(); //loop through and create all the processes you want @@ -534,20 +540,36 @@ void DistanceCommand::createProcesses(string filename) { int pid = fork(); if (pid > 0) { - processIDS[lines[process]->end] = pid; //create map from line number to pid so you can append files in correct order later + processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later process++; }else if (pid == 0){ if (output != "square") { driver(lines[process]->start, lines[process]->end, filename + toString(getpid()) + ".temp", cutoff); } else { driver(lines[process]->start, lines[process]->end, filename + toString(getpid()) + ".temp", "square"); } exit(0); - }else { m->mothurOut("unable to spawn the necessary processes."); m->mothurOutEndLine(); exit(0); } + }else { + m->mothurOut("[ERROR]: unable to spawn the necessary processes. Error code: " + toString(pid)); m->mothurOutEndLine(); + perror(" : "); + for (int i=0;istart, lines[0]->end, filename, cutoff); } + else { driver(lines[0]->start, lines[0]->end, filename, "square"); } + + //force parent to wait until all the processes are done - for (map::iterator it = processIDS.begin(); it != processIDS.end(); it++) { - int temp = it->second; + for (int i=0;iappendFiles((filename + toString(processIDS[i]) + ".temp"), filename); + remove((filename + toString(processIDS[i]) + ".temp").c_str()); + } #endif } catch(exception& e) {