将大文件写入磁盘时出现内存不足异常

3

我想尝试编写和读取一个大型的随机文件来计算磁盘速度。我已经尝试了几种算法,但在尝试写入1GB文件时始终出现内存溢出异常。以下是我尝试过的一些方法:

方法1

   byte[] data = new byte[8192];
        Random rng = new Random();
        using (FileStream stream = File.OpenWrite(filePath))
        {
            for (int i = 0; i < fileSizeMb * 128; i++)
            {
                rng.NextBytes(data);
                stream.Write(data, 0, data.Length);
            }
        }

方法二
const int blockSize = 1024 * 8;
            const int blocksPerMb = (1024 * 1024) / blockSize;

            int count = fileSizeMb * blocksPerMb;

            byte[] data = new byte[blockSize];
            Random rng = new Random();
            //using (FileStream stream = File.OpenWrite(filePath))
            using (StreamWriter sw1 = new StreamWriter(filePath))
            {
                // There 
                for (int i = 0; i < count; i++)
                {
                    rng.NextBytes(data);
                    sw1.BaseStream.Write(data, 0, data.Length);
                    //stream.Write(data, 0, data.Length);

                }
            }

阅读

   using (StreamReader sr = new StreamReader(filePath))
            {
                String line = sr.ReadToEnd();
            }

你确定在读取时没有遇到 OutOfMemoryException 吗?另外,StreamReader/Writer 用于读取/写入文本数据,对于二进制数据只需使用 Stream - Ivan Stoev
1个回答

6

方法一

        byte[] data = new byte[8192];
        Random rng = new Random();
        using (FileStream stream = File.OpenWrite(filePath))
        {
            for (int i = 0; i < fileSizeMb * 128; i++)
            {
                rng.NextBytes(data);
                stream.Write(data, 0, data.Length);
                stream.Flush(); // BEETLE JUICE
            }
        }

方法二
        const int blockSize = 1024 * 8;
        const int blocksPerMb = (1024 * 1024) / blockSize;

        int count = fileSizeMb * blocksPerMb;

        byte[] data = new byte[blockSize];
        Random rng = new Random();
        using (StreamWriter sw1 = new StreamWriter(filePath))
        {
            // There 
            for (int i = 0; i < count; i++)
            {
                rng.NextBytes(data);
                sw1.BaseStream.Write(data, 0, data.Length);
                sw1.baseStream.Flush(); // BEETLE JUICE
            }
        }

阅读

不要将整个文件读入内存,每次只读取4096字节。示例代码在http://www.csharp-examples.net/filestream-read-file/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接