public void Compress(string input, string output, int chunkSize) { var chunksPool = new DataChunksPool(); using (var readStream = new FileStream(input, FileMode.Open)) using (var writeStream = new FileStream(output, FileMode.Create)) { var reader = new FixedSizeReader(readStream, chunkSize, chunksPool.Get); var writer = new OrderedWriter(writeStream, new CompressedFormatter(), 10, chunksPool.Return); var worker = new Worker(reader, writer, new DataChunkCompressProcessor(chunksPool.Get), chunksPool.Return); worker.Process(); } }
public Worker( IFileReader fileReader, OrderedWriter writer, IDataChunkProcessor processor, Action <DataChunk> freeChunk) { _prefetcher = new Prefetcher(fileReader, 20, 5); _prefetcher.Ended += PrefetcherOnEnded; _writer = writer; _processor = processor; _freeChunk = freeChunk; var threadsCount = Environment.ProcessorCount - 2; _workerThreads = new Thread[threadsCount]; for (int i = 0; i < threadsCount; i++) { _workerThreads[i] = new Thread(ProcessInternal) { IsBackground = true }; } }