所以,首先,我在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时保持一个块的顺序(显然必须按顺序进行)。似乎压缩是非威慑性的,即使我知道每个块的唯一索引,它也无济于事:仍然不知道压缩后它会在哪里。
有什么建议吗?