我希望能够并行读取和写入大文件,或者如果不是并行读取,至少在块中,这样我就不会耗费太多内存。
这是我目前的代码:
// Define memory stream which will be used to hold encrypted data.
MemoryStream memoryStream = new MemoryStream();
// Define cryptographic stream (always use Write mode for encryption).
CryptoStream cryptoStream = new CryptoStream(memoryStream,
encryptor,
CryptoStreamMode.Write);
//start encrypting
using (BinaryReader reader = new BinaryReader(File.Open(fileIn, FileMode.Open))) {
byte[] buffer = new byte[1024 * 1024];
int read = 0;
do {
read = reader.Read(buffer, 0, buffer.Length);
cryptoStream.Write(buffer, 0, read);
} while (read == buffer.Length);
}
// Finish encrypting.
cryptoStream.FlushFinalBlock();
// Convert our encrypted data from a memory stream into a byte array.
//byte[] cipherTextBytes = memoryStream.ToArray();
//write our memory stream to a file
memoryStream.Position = 0;
using (BinaryWriter writer = new BinaryWriter(File.Open(fileOut, FileMode.Create))) {
byte[] buffer = new byte[1024 * 1024];
int read = 0;
do {
read = memoryStream.Read(buffer, 0, buffer.Length);
writer.Write(buffer, 0, read);
} while (read == buffer.Length);
}
// Close both streams.
memoryStream.Close();
cryptoStream.Close();
如您所见,它将整个文件读入内存,对其进行加密,然后将其写出。如果我碰巧加密非常大(2GB +)的文件,它往往不起作用,或者至少消耗大约97%的内存。
我怎样才能更有效地做到这一点?
答案 0 :(得分:1)
不要将CryptoStream
与MemoryStream
挂钩,而是将其写入输出FileStream
。您根本不需要MemoryStream
。
更新:按顺序处理文件更有效,而不是并行处理。所以我不建议并行读/写情况;只是摆脱MemoryStream
。
答案 1 :(得分:1)
简单明了的解决方案是将CryptoStream
写入临时文件,然后在完成后将临时文件重命名为旧文件。这将摆脱你的内存问题,并给你一个瞬态的磁盘空间问题:),但这是你可以更容易解决的问题。
答案 2 :(得分:0)
虽然它需要一些棘手的编排,但您可以创建两个并行运行的单独文件流操作...一个读取和一个写入。另一种方法是创建一个内存映射文件并执行相同的操作。每个流都可以根据其特定需求进行优化(例如,读者可以寻求,作者可能只是一个前进的作者)。