我有以下代码,在写入大文件时抛出内存不足异常。我有什么遗漏的吗?
我不确定为什么它会抛出内存不足错误,因为我认为文件流最多只能使用 4096 字节作为缓冲区?老实说,我不完全确定缓冲区意味着什么,任何建议将不胜感激。
public static async Task CreateRandomFile(string pathway, int size, IProgress<int> prog)
{
byte[] fileSize = new byte[size];
new Random().NextBytes(fileSize);
await Task.Run(() =>
{
using (FileStream fs = File.Create(pathway,4096))
{
for (int i = 0; i < size; i++)
{
fs.WriteByte(fileSize[i]);
prog.Report(i);
}
}
}
);
}
public static void p_ProgressChanged(object sender, int e)
{
int pos = Console.CursorTop;
Console.WriteLine("Progress Copied: " + e);
Console.SetCursorPosition (0, pos);
}
public static void Main()
{
Console.WriteLine("Testing CopyLearning");
//CopyFile()
Progress<int> p = new Progress<int>();
p.ProgressChanged += p_ProgressChanged;
Task ta = CreateRandomFile(@"D:\Programming\Testing\RandomFile.asd", 99999999, p);
ta.Wait();
}
编辑:99,999,999 只是为了制作 99MB 文件而创建的
注意:我已经注释掉了 prog.Report(i) ,它会正常工作。
似乎由于某种原因,该错误发生在该行
Console.writeline("Progress Copied: " + e);
我不完全确定为什么这会导致错误?那么错误可能是由于 ProgressEvent 引起的?
编辑 2:我遵循建议更改代码,以便使用以下内容每 4000 字节报告进度:
if (i%4000==0)
prog.Report(i);
因为某些原因。我现在能够写入高达 900MB 的文件。
我想问题是,为什么“Edit 2”的代码允许它写入 900MB 就可以了?是因为它报告进度并写入控制台的速度比以前少了 4000 倍吗?我没有意识到控制台会占用这么多内存,特别是因为我假设它所做的只是输出“进度已复制”?
Edit 3:
由于某种原因,当我将以下行更改如下时:
for (int i = 0; i < size; i++)
{
fs.WriteByte(fileSize[i]);
Console.Writeline(i)
prog.Report(i);
}
在 prog.Report(i) 之前有一个“Console.Writeline()”,它可以正常工作并复制文件,尽管需要很长时间才能完成。这让我相信这是由于某种原因与控制台相关的问题,但我不确定是什么。