Exemple #1
0
        public SortMerge(string fname)
        {
            tmpPath = "tmp" + Guid.NewGuid();
            Directory.CreateDirectory(tmpPath);
            // begin calculate simplified performance
            stTime = DateTime.Now;

            Console.WriteLine("initial dividing..");
            int countFiles = DivideAndSortInitial(fname);

            string fnameResult = string.Empty;

            while (true)
            {
                // observe exist files
                string[] arr = Directory.GetFiles(tmpPath, "p" + phase + "_*.txt");
                // detect what sorting complete if files merged in one
                if (arr.Length == 1)
                {
                    fnameResult = arr[0];
                    break;
                }
                // begin new phase
                int len = arr.Length / 2;
                phase++; Console.WriteLine("phase " + phase);
                // prepare data for tasks
                var pairs = new List <FilePair>();
                for (int i = 0; i < len; i++)
                {
                    int      idx       = i * 2;
                    string   fnameSrc1 = arr[idx];
                    string   fnameSrc2 = arr[idx + 1];
                    string   fnameDst  = tmpPath + "\\p" + phase + "_" + i + ".txt";
                    FilePair pair      = new FilePair(fnameSrc1, fnameSrc2, fnameDst);
                    pairs.Add(pair);
                }
                // parallel sort pairs
                Parallel.ForEach(pairs, pair => { SortPair(pair); });
                // odd file was migrate to next phase
                if (arr.Length > len * 2)
                {
                    File.Move(arr[arr.Length - 1], tmpPath + "\\p" + phase + "_" + len + ".txt");
                }
            }
            // emit result file to source dirrectory
            FileResult = fname + ".sorted";
            if (File.Exists(FileResult))
            {
                FileResult += "." + Guid.NewGuid();
            }
            File.Move(fnameResult, FileResult);
            // clean temporary files
            Directory.Delete(tmpPath, true);
            //begin calculate simplified performance
            enTime = DateTime.Now;
        }
Exemple #2
0
        void SortPair(object state)
        {
            FilePair pair = (FilePair)state;

            using (StreamReader sr1 = new StreamReader(pair.fnameSrc1),
                   sr2 = new StreamReader(pair.fnameSrc2))
            {
                using (StreamWriter sw = new StreamWriter(pair.fnameDst))
                {
                    string line1 = null;
                    string line2 = null;
                    while (true)
                    {
                        if (line1 == null)
                        {
                            if (sr1.Peek() >= 0)
                            {
                                line1 = sr1.ReadLine();
                            }
                        }

                        if (line2 == null)
                        {
                            if (sr2.Peek() >= 0)
                            {
                                line2 = sr2.ReadLine();
                            }
                        }

                        if ((line1 == null) && (line2 == null))
                        {
                            break;
                        }

                        if (String.Compare(line1, line2) > 0)
                        {
                            sw.WriteLine(line1);
                            line1 = null;
                        }
                        else
                        {
                            sw.WriteLine(line2);
                            line2 = null;
                        }
                    }
                    sw.Flush();
                }
            }
        }