并行压缩大文件(~30 GB)?

时间:2018-05-11 07:37:08

标签: .net multithreading parallel-processing io compression

所以,首先,我在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;
    }

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

有什么建议吗?

0 个答案:

没有答案