并行读写

时间:2010-05-25 17:56:43

标签: c# io

我希望能够并行读取和写入大文件,或者如果不是并行读取,至少在块中,这样我就不会耗费太多内存。

这是我目前的代码:

        // 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%的内存。

我怎样才能更有效地做到这一点?

3 个答案:

答案 0 :(得分:1)

不要将CryptoStreamMemoryStream挂钩,而是将其写入输出FileStream。您根本不需要MemoryStream

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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