首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行读写

问并行读写
EN

Stack Overflow用户
提问于 2010-05-26 01:56:43
回答 3查看 3.2K关注 0票数 2

我希望能够并行读写一个大文件,如果不是并行读写,至少是分块读写,这样就不会占用太多内存。

这是我当前的代码:

代码语言:javascript
复制
        // 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%的内存。

我怎样才能以更有效的方式做这件事呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-26 02:00:01

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

更新:顺序处理文件比并行处理文件效率更高。因此,我不建议使用并行读/写的情况;只要去掉MemoryStream即可。

票数 1
EN

Stack Overflow用户

发布于 2010-05-26 02:02:13

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

票数 1
EN

Stack Overflow用户

发布于 2010-05-26 04:27:39

虽然它需要一些棘手的编排,但您可以创建两个并行运行的独立文件流操作...一读一写。另一种选择是创建一个内存映射文件并执行相同的操作。每个流都可以针对其特定需求进行优化(例如,读取器可以查找,写入器可以是只向前的写入器)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2907165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档