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); }
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); }
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; }
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}"); }