Чтение и запись параллельно - PullRequest
1 голос
/ 25 мая 2010

Я хочу иметь возможность читать и записывать большой файл параллельно или, если не параллельно, по крайней мере в блоках, чтобы я не занимал так много памяти.

Это мой текущий код:

        // 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% моей памяти.

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

Ответы [ 3 ]

1 голос
/ 25 мая 2010

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

1 голос
/ 25 мая 2010

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

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

0 голосов
/ 26 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...