2010-05-25 150 views
1

我希望能够并行读取或写入大文件,或者如果不是并行读取,至少要分块写入,这样才不会占用太多内存。并行读取和写入

这是我当前的代码:

 // 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

您不能更有效地维护加密。 – SLaks 2010-05-25 18:00:59

+0

加密后,我不能一次写出几个数据块吗? – Malfist 2010-05-25 18:02:44

+0

除非您使用ECB(这是不安全的),否则每个块都取决于所有前面的块。 – SLaks 2010-05-25 18:11:49

回答

1

而不是将CryptoStream连接到MemoryStream,让它写入输出FileStream。你根本不需要MemoryStream

更新:按顺序处理文件而不是并行处理效率更高。所以我不建议并行读/写的情况;刚刚摆脱MemoryStream

1

简单而明显的解决方案是让CryptoStream写入临时文件,然后在完成后将临时文件重命名为旧文件。这将消除你的内存问题,并给你一个瞬间磁盘空间问题:),但这是你可能更容易解决的问题。

0

虽然它需要一些棘手的编排,但您可以创建两个并行运行的独立文件流操作,一个读取和一个写入。另一种方法是创建一个内存映射文件并执行相同操作。每个流都可以针对其特定需求进行优化(例如,读者可以寻求,作者可能只是一名前锋作家)。