private List <File> SortPhase(File sourceFile, uint bufferSize, int nSortRuns) { SortBuffer sortBuffer = new SortBuffer( nBlocks: bufferSize, blockSize: sourceFile.blockSize); List <File> runFiles = new List <File>(); for (int runIndex = 0; runIndex < nSortRuns; runIndex++) { var outFile = SortPass(sourceFile, bufferSize, sortBuffer, runIndex); runFiles.Add(outFile); } return(runFiles); }
private File SortPass(File sourceFile, uint bufferSize, SortBuffer sortBuffer, int runIndex = 0) { sortBuffer.loadBlocks( sourceFile: sourceFile, startingBlock: (int)(runIndex * bufferSize) ); sortBuffer.Sort(); File outFile = new File( nBlocks: bufferSize, blockSize: sourceFile.blockSize, initializer: 0); sortBuffer.writeBack(outFile); return(outFile); }
//TODO: add block transfer counting to evaluate performance public File ExternalMergeSort(File sourceFile, uint bufferSize) { //Check wether there is enough blocks in the buffer? File sortedFile; int nSortRuns = (int)Math.Ceiling((decimal)(sourceFile.nBlocks / bufferSize)); if (nSortRuns > 1) { var runFiles = SortPhase(sourceFile, bufferSize, nSortRuns); sortedFile = MergePhase(sourceFile, bufferSize, runFiles); } else { SortBuffer sortBuffer = new SortBuffer( nBlocks: bufferSize, blockSize: sourceFile.blockSize); sortedFile = SortPass(sourceFile, bufferSize, sortBuffer); } return(sortedFile); }