Example #1
0
 public ExternalMergeSort_LargeFiles_IntegrationTests(LargeFilesFixture fixture)
 {
     _fixture = fixture ?? throw new ArgumentNullException(nameof(fixture));
     _sut     = new ExternalMergeSorter(new ExternalMergeSorterOptions {
         FileLocation = _fixture.FilesDirectory
     });
 }
 public ExternalMergeSort_SmallFiles_IntegrationTests(SmallFilesFixture fixture)
 {
     _fixture = fixture;
     _sut     = new ExternalMergeSorter(new ExternalMergeSorterOptions {
         FileLocation = _fixture.FilesDirectory
     });
 }
        public static void ArraySorted_OnDisk([Random(0, 1000, 100, Distinct = true)] int n)
        {
            // Arrange
            var sorter      = new ExternalMergeSorter <int>();
            var intComparer = new IntComparer();

            var(correctArray, testArray) = RandomHelper.GetArrays(n);
            var randomizer = Randomizer.CreateRandomizer();
            var main       = new IntFileStorage($"sorted_{randomizer.GetString(100)}", n);
            var temp       = new IntFileStorage($"temp_{randomizer.GetString(100)}", n);

            var writer = main.GetWriter();

            for (var i = 0; i < n; i++)
            {
                writer.Write(correctArray[i]);
            }
            writer.Dispose();

            // Act
            sorter.Sort(main, temp, intComparer);
            Array.Sort(correctArray, intComparer);

            // Assert
            var reader = main.GetReader();

            for (var i = 0; i < n; i++)
            {
                testArray[i] = reader.Read();
            }

            Assert.AreEqual(testArray, correctArray);
        }
Example #4
0
        private void OnProgressMessagePosted(object sender, ExternalMergeSorter.ProgressMessagePostedEventArgs e)
        {
            if (logListBox.InvokeRequired)
                Invoke(new Action<string>(DisplayMessage), e.Message);
            else
                DisplayMessage(e.Message);

            if (e.Status == ExternalMergeSorter.SortStatus.Completed)
                Invoke(new Action(ResetForm));
        }
        public static void ArraySorted([Random(0, 1000, 100, Distinct = true)] int n)
        {
            // Arrange
            var sorter      = new ExternalMergeSorter <int>();
            var intComparer = new IntComparer();

            var(correctArray, testArray) = RandomHelper.GetArrays(n);
            var main = new IntInMemoryStorage(testArray);
            var temp = new IntInMemoryStorage(new int[testArray.Length]);

            // Act
            sorter.Sort(main, temp, intComparer);
            Array.Sort(correctArray, intComparer);

            // Assert
            Assert.AreEqual(testArray, correctArray);
        }
Example #6
0
        private void startButton_Click(object sender, EventArgs e)
        {
            int chunkSize;
            try
            {
                chunkSize = Int32.Parse(chunkSizeTextBox.Text);
            }
            catch
            {
                MessageBox.Show("\"" + chunkSizeTextBox.Text + "\" is not a valid integer value.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            tokenSource = new CancellationTokenSource();
            var token = tokenSource.Token;

            var sorter = new ExternalMergeSorter(filePath, chunkSize, !overwriteCheckBox.Checked, tokenSource.Token);
            sorter.ProgressMessagePosted += OnProgressMessagePosted;

            Task.Factory.StartNew(async () => await sorter.Sort(), tokenSource.Token);

            cancelButton.Enabled = true;
            startButton.Enabled = false;
            selectFileButton.Enabled = false;
        }
Example #7
0
        public static async Task Main(string[] args)
        {
            var rows             = 10_000_000;
            var sourceFilename   = $"unsorted.{rows}.csv";
            var unsortedFilePath = Path.Combine(FileGenerator.FileLocation, sourceFilename);

            if (!File.Exists(unsortedFilePath))
            {
                System.Console.WriteLine($"{sourceFilename} does not exists, creating...");
                await FileGenerator.CreateFile(rows, FileGenerator.FileLocation);

                System.Console.WriteLine($"{sourceFilename} has been created");
            }

            var comparer = new CsvColumnSorter_Substring(2);
            var command  = new ExternalMergeSorter(new ExternalMergeSorterOptions
            {
                Sort = new ExternalMergeSortSortOptions
                {
                    Comparer = comparer
                }
            });
            var commandName = comparer.GetType().Name;
            var sourceFile  = File.OpenRead(Path.Combine(FileGenerator.FileLocation, sourceFilename));
            var targetFile  = File.OpenWrite(Path.Combine(FileGenerator.FileLocation, $"{commandName}.{rows}.csv".ToLower()));
            var stopwatch   = Stopwatch.StartNew();
            await command.Sort(sourceFile, targetFile, CancellationToken.None);

            stopwatch.Stop();
            System.Console.WriteLine($"{commandName} done, took {stopwatch.Elapsed}");

            //var splitFileProgressHandler = new Progress<double>(x =>
            //{
            //    var percentage = x * 100;
            //    System.Console.WriteLine($"Split progress: {percentage:##.##}%");
            //});
            //var sortFilesProgressHandler = new Progress<double>(x =>
            //{
            //    var percentage = x * 100;
            //    System.Console.WriteLine($"Sort progress: {percentage:##.##}%");
            //});
            //var mergeFilesProgressHandler = new Progress<double>(x =>
            //{
            //    var percentage = x * 100;
            //    System.Console.WriteLine($"Merge progress: {percentage:##.##}%");
            //});

            //var sortCommand = new ExternalMergeSorter(new ExternalMergeSorterOptions
            //{
            //    Split = new ExternalMergeSortSplitOptions
            //    {
            //        ProgressHandler = splitFileProgressHandler
            //    },
            //    Sort = new ExternalMergeSortSortOptions
            //    {
            //        ProgressHandler = sortFilesProgressHandler
            //    },
            //    Merge = new ExternalMergeSortMergeOptions
            //    {
            //        ProgressHandler = mergeFilesProgressHandler
            //    }
            //});

            //var sourceFile = Path.Combine(FileGenerator.FileLocation, sourceFilename);
            //var targetFile = File.OpenWrite(Path.Combine(FileGenerator.FileLocation, $"sorted.{rows}.csv"));
            //System.Console.WriteLine($"Starting to sort {sourceFilename}...");
            //var stopwatch = Stopwatch.StartNew();
            //await sortCommand.Sort(File.OpenRead(sourceFile), targetFile, CancellationToken.None);
            //stopwatch.Stop();
            //System.Console.WriteLine($"MergeSort done, took {stopwatch.Elapsed}");

            //System.Console.WriteLine("Starting to sort In-memory...");
            //stopwatch.Restart();
            //var unsortedRows = await File.ReadAllLinesAsync(unsortedFilePath);
            //Array.Sort(unsortedRows);
            //await File.WriteAllLinesAsync(Path.Combine(FileGenerator.FileLocation, "sorted.inmemory.csv"), unsortedRows);
            //stopwatch.Stop();
            //System.Console.WriteLine($"In-memory done, took {stopwatch.Elapsed}");
        }