Разница между размером буфера при копировании потоков - PullRequest
0 голосов
/ 18 февраля 2012

Я видел много примеров реализации CopyStream, но у меня есть вопрос о размере буфера при копировании потоков.
Пример одной из реализаций CopyStream:

private void ReadWriteStream(Stream readStream, Stream writeStream)
{
    int Length = 256;
    Byte[] buffer = new Byte[Length];
    int bytesRead = readStream.Read(buffer, 0, Length);
    // write the required bytes
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, Length);
    }
    readStream.Close();
    writeStream.Close();
}

Вопросы:

  • Какой должна быть длина буферов (я видел 256, 8 * 1024, 32768)?
  • Насколько разныеразмер буфера влияет на производительность, использование памяти и т. д.?

Смежные вопросы:
Файл IO с потоками - лучший размер буфера памяти - хороший ответ файла IO.Но как насчет копирования в памяти?


Мой случай:
Существует MemotyStream, который я создаю с использованием ClosedXML workbook.SaveAs(memoryStream);, и он выделяетсяогромное количество памяти в управляемой куче.Я посмотрел источники и обнаружил, что есть метод CopyStream, который использует размер буфера 8 * 1024.Может ли изменение этого размера как-то уменьшить использование памяти?
Примечание: Поток занимает почти 1 ГБ памяти.

1 Ответ

5 голосов
/ 18 февраля 2012

Если вы используете .NET 4, вы можете сделать это проще:

srcStream.CopyTo(dstStream);

Но если вы хотите / должны реализовать это самостоятельно, я бы предложил меньший буфер (256B - 1KB) для потоков памяти и носителя.размер буфера (10 КБ) для файловых потоков.Вы также можете сделать его зависимым от размера исходного потока, например, 10% с некоторым ограничением размера в 1 МБ или около того.

Для файлов: чем больше буфер, тем быстрее операция копирования (до некоторой степени), но менее безопасна,Для потоков памяти небольшой буфер почти так же эффективен, как и большой, но проще для памяти (если вы много копируете).

...