Что такого особенного в 4 КБ для длины буфера? - PullRequest
6 голосов
/ 05 июля 2011

При выполнении файлового ввода-вывода в .NET кажется, что 95% примеров, которые я вижу, используют 4096-байтовый буфер. Что такого особенного в 4 КБ для длины буфера? Или это просто соглашение, подобное использованию i для индекса в цикле for?

Ответы [ 3 ]

8 голосов
/ 05 июля 2011

Это потому, что 4K является размером кластера по умолчанию для дисков до 16 ТБ.Поэтому при выборе размера буфера имеет смысл выделить буфер в кратных размерах кластера.

Кластер - это наименьшая единица выделения для файла, поэтому, если файл содержит только 1 байт, он будет занимать 4 КБ.физического дискового пространства.И файл 5K приведет к выделению 8K. Обновление : добавлен пример кода для получения размера кластера диска

using System;
using System.Runtime.InteropServices;

class Program
{
  [DllImport("kernel32", SetLastError=true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  static extern bool GetDiskFreeSpace(
    string rootPathName,
    out int sectorsPerCluster,
    out int bytesPerSector,
    out int numberOfFreeClusters,
    out int totalNumberOfClusters);

  static void Main(string[] args)
  {
    int sectorsPerCluster;
    int bytesPerSector;
    int numberOfFreeClusters;
    int totalNumberOfClusters;

    if (GetDiskFreeSpace("C:\\", 
          out sectorsPerCluster, 
          out bytesPerSector, 
          out numberOfFreeClusters, 
          out totalNumberOfClusters))
    {        
      Console.WriteLine("Cluster size = {0} bytes", 
        sectorsPerCluster * bytesPerSector);
    }
    else
    {
      Console.WriteLine("GetDiskFreeSpace Failed: {0:x}", 
        Marshal.GetLastWin32Error());
    }

    Console.ReadKey();
  }
}
1 голос
/ 05 июля 2011

Несколько факторов:

  • Чаще всего 4K - это размер кластера на диске
  • 4K - это самый распространенный размер страницы в Windows, поэтому ОС можетФайлы карты памяти в 4K-блоках
  • Страницу 4K часто можно перенести с накопителя на ОС в пользовательский процесс без копирования
  • Windows кэширует файлы в ОЗУ с использованием буферов 4K.

Самое главное, что за многие годы многие люди использовали 4K в качестве длины буфера из-за вышеизложенного, поэтому большая часть кода ввода-вывода и ОС оптимизирована для буферов 4K!

0 голосов
/ 05 июля 2011

Полагаю, это связано с размером блока файла ОС - Windows в .NET.

...