Untitled

 avatar
unknown
plain_text
a year ago
4.5 kB
7
Indexable
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main()
    {
        string inputFilePath = "input_large_file.txt";
        string outputFilePath = "sorted_large_file.txt";
        int chunkSize = 100000; // Adjust this based on your system's memory and performance

        try
        {
            // Step 1: Read the input file in chunks, sort each chunk, and write them to temporary files
            int tempFileCount = CreateSortedChunks(inputFilePath, chunkSize);

            // Step 2: Merge sorted chunks into the output file
            MergeSortedChunks(tempFileCount, outputFilePath);

            Console.WriteLine("File sorted successfully.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }

    static int CreateSortedChunks(string inputFilePath, int chunkSize)
    {
        int tempFileCount = 0;
        List<int> chunk = new List<int>(chunkSize);

        using (var inputFileStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
        using (var streamReader = new StreamReader(inputFileStream))
        {
            while (!streamReader.EndOfStream)
            {
                string line;
                while (chunk.Count < chunkSize && (line = streamReader.ReadLine()) != null)
                {
                    if (int.TryParse(line, out int number))
                    {
                        chunk.Add(number);
                    }
                }

                chunk.Sort();

                string tempFilePath = $"temp_chunk_{tempFileCount}.txt";
                using (var tempFileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
                using (var streamWriter = new StreamWriter(tempFileStream))
                {
                    foreach (int num in chunk)
                    {
                        streamWriter.WriteLine(num);
                    }
                }

                tempFileCount++;
                chunk.Clear();
            }
        }

        return tempFileCount;
    }

    static void MergeSortedChunks(int tempFileCount, string outputFilePath)
    {
        using (var outputFileStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
        using (var streamWriter = new StreamWriter(outputFileStream))
        {
            var readers = new StreamReader[tempFileCount];
            var currentValues = new int[tempFileCount];
            var finished = new bool[tempFileCount];

            // Open all temporary files and initialize currentValues array
            for (int i = 0; i < tempFileCount; i++)
            {
                readers[i] = new StreamReader($"temp_chunk_{i}.txt");
                string line = readers[i].ReadLine();
                if (line != null)
                {
                    currentValues[i] = int.Parse(line);
                }
                else
                {
                    finished[i] = true;
                }
            }

            // Merge sorted chunks
            while (true)
            {
                int minValue = int.MaxValue;
                int minIndex = -1;

                // Find the smallest value among the current values from all temporary files
                for (int i = 0; i < tempFileCount; i++)
                {
                    if (!finished[i] && currentValues[i] < minValue)
                    {
                        minValue = currentValues[i];
                        minIndex = i;
                    }
                }

                // If all values are read from a file, mark it as finished
                if (minIndex == -1)
                    break;

                // Write the smallest value to the output file
                streamWriter.WriteLine(minValue);

                // Read the next value from the temporary file
                string line = readers[minIndex].ReadLine();
                if (line != null)
                {
                    currentValues[minIndex] = int.Parse(line);
                }
                else
                {
                    finished[minIndex] = true;
                }
            }

            // Close all readers and delete temporary files
            for (int i = 0; i < tempFileCount; i++)
            {
                readers[i].Close();
                File.Delete($"temp_chunk_{i}.txt");
            }
        }
    }
}
Editor is loading...
Leave a Comment