Исключение из-за нехватки памяти при использовании байта потока файлов для вывода в консоль
У меня есть следующий код, который выдает исключение нехватки памяти при записи больших файлов. Я что-то упускаю?
Я не уверен, почему он выдает ошибку нехватки памяти, так как я думал, что файловый поток будет использовать только 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);
По какой-то причине. Теперь я могу писать файлы размером до 900 МБ.
Я предполагаю, что вопрос в том, почему код "Edit 2" позволил бы ему писать до 900 МБ просто отлично? Это потому, что он сообщает о прогрессе и пишет в консоль в 4000 раз меньше, чем раньше? Я не знал, что консоль будет занимать так много памяти, особенно потому, что я предполагаю, что все, что она делает, это выводит "Progress Copied"?
Изменить 3:
По какой-то причине, когда я меняю следующую строку следующим образом:
for (int i = 0; i < size; i++)
{
fs.WriteByte(fileSize[i]);
Console.Writeline(i)
prog.Report(i);
}
где перед prog.Report (i) стоит «Console.Writeline ()», он будет нормально работать и копировать файл, хотя это займет очень много времени. Это заставляет меня поверить, что по какой-то причине это связано с консолью, но я не уверен, что именно.