我希望能够并行读写一个大文件,如果不是并行读写,至少是分块读写,这样就不会占用太多内存。
这是我当前的代码:
// 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%的内存。
我怎样才能以更有效的方式做这件事呢?
发布于 2010-05-26 02:00:01
不是将CryptoStream连接到MemoryStream,而是让它写入输出FileStream。您根本不需要MemoryStream。
更新:顺序处理文件比并行处理文件效率更高。因此,我不建议使用并行读/写的情况;只要去掉MemoryStream即可。
发布于 2010-05-26 02:02:13
简单、显而易见的解决方案是让CryptoStream写入一个临时文件,然后在写完后将该临时文件重命名为旧文件。这将解决您的内存问题,并给您一个暂时的磁盘空间问题:),但这可能是您可以更容易解决的问题。
发布于 2010-05-26 04:27:39
虽然它需要一些棘手的编排,但您可以创建两个并行运行的独立文件流操作...一读一写。另一种选择是创建一个内存映射文件并执行相同的操作。每个流都可以针对其特定需求进行优化(例如,读取器可以查找,写入器可以是只向前的写入器)。
https://stackoverflow.com/questions/2907165
复制相似问题