首页 > 解决方案 > 并行压缩大文件(~30 GB)?

问题描述

所以,首先,我在 32MB 上分块读取文件:

var inputFileReader = new Thread(() =>
        {
            var buffer = new byte[_32_MB];
            using (var fileStream = File.Open(fileURL, FileMode.Open, FileAccess.Read))
            using (var bufferedStream = new BufferedStream(fileStream))
            {
                while (bufferedStream.Read(buffer, 0, _32_MB) != 0)
                {
                    // queue might be oversized:
                    // .Wait() suppose to guarantee it won't happen
                    _queue.Wait();
                    _queue.Push(buffer);
                }

                Console.WriteLine("File reading done.");
                _applicationIsRunning = false;
            }
        });

然后其他线程(尚未实现)假设获取这些原始字节并使用MemoryStream. 我希望这样的事情只适用于我想重用一些线程而不是每次都创建一个新线程的更正:

public static byte[] GZip(byte[] bytes)
    {
        byte[] res = { };

        var compressor = new Thread(() =>
        {
            using (var memoryStream = new MemoryStream())
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, false))
            {
                gZipStream.Write(bytes, 0, bytes.Length);
                res = memoryStream.ToArray();
            }
        });
        compressor.Start();

        return res;
    }

问题:现在看来我的设计完全错误:如何在将块写入输出文件时保持块的顺序(显然必须按顺序进行)。似乎压缩是不确定的,即使我知道每个块的唯一索引,它也无济于事:a 仍然不知道压缩后它会在哪里。

有什么建议么?

标签: .netmultithreadingparallel-processingiocompression

解决方案


推荐阅读