.net - 并行压缩大文件(~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 仍然不知道压缩后它会在哪里。
有什么建议么?
解决方案
推荐阅读
- c# - UWP Setter 自定义 DependencyProperty
- django - 为什么我无法保存 Django ModelForm 博客的编辑?
- javascript - formdata.append 组合关联数组
- vue.js - v-navigation-drawer 在窗口调整大小时掉入失控循环
- associations - 在 Alfresco 中启用重复文件名
- python - 将 for 循环结果转换为 numpy 数组
- java - Selenium Grid + Maven + TestNG + 范围报告 + 并行测试
- c# - Linq RemoveAll 使用 ContainsList 而不是 AddArrayParameters
- c# - 在 Powershell Core 中调用 C# 方法
- python - 如何从一个特定的字母开始并在它达到一个数字时结束?