2010-05-25 5 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(); 

Как вы можете видеть, он читает весь файл в память, шифрует его, а затем записывает его. Если я использую шифрование файлов, которые очень большие (2 ГБ +), он не работает или, по крайней мере, потребляет 97% моей памяти.

Как я могу сделать это более эффективно?

+0

Вы не можете этого более эффективно и поддерживать шифрование. – SLaks

+0

Я не могу выписать несколько блоков за один раз после их зашифрования? – Malfist

+0

Если вы не используете ECB (который небезопасен), каждый блок зависит от всех предыдущих блоков. – SLaks

ответ

1

Вместо того, чтобы подключить CryptoStream к MemoryStream, у вас есть запись на выход FileStream. Вам не нужно вообще MemoryStream.

Обновление: Эффективно обрабатывать файлы последовательно, а не параллельно. Поэтому я не рекомендую параллельную ситуацию чтения/записи; просто избавьтесь от MemoryStream.

1

Простое, очевидное решение состоит в том, чтобы записать CryptoStream во временный файл, а затем переименовать временный файл в старый файл, когда закончите. Это избавит вас от проблемы с памятью и даст вам проблему с временным дисковым пространством :), но это то, что вы, вероятно, можете работать более легко.

0

Хотя это требует некоторой сложной оркестровки, вы можете создать две отдельные операции с файловыми потоками, которые работают параллельно ... одно чтение и одно письмо. Другой вариант - создать файл с отображением памяти и сделать то же самое. Каждый поток может быть оптимизирован для удовлетворения своих конкретных потребностей (например, читатель мог бы искать, причем писатель мог быть только писателем с прямым доступом).

Смежные вопросы