Какой идеальный размер блока памяти использовать при копировании? - PullRequest
7 голосов
/ 27 марта 2011

Я сейчас использую 100 мегабайт на блок памяти для копирования больших файлов.

Есть ли "хорошая" сумма, которую люди обычно используют?

Редактировать

Спасибо за все замечательные ответы.

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

Ответы [ 6 ]

9 голосов
/ 27 марта 2011

Типичный выбор - блок от 4096 до 32 КБ.Использование 100 МБ контрпродуктивно.Вы занимаете ОЗУ буфером, который можно установить на много , лучше использовать в качестве кеша обратной записи файловой системы.

Копирование файлов происходит очень быстро, когда файл полностью помещается в кеш, WriteFile() вызов является простой копией из памяти в память.Затем менеджер кэша лениво записывает его на диск.Но когда в кеше больше нет места, скорость копирования падает с обрыва, когда WriteFile () должен ждать, пока освободится место.Теперь он работает на скорости записи на диск.

5 голосов
/ 27 марта 2011

Я бы порекомендовал вам сделать это, и не забудьте включить намного блоков меньшего размера.В моих собственных тестах я получил довольно противоречивые результаты.

При чтении и записи с жесткого диска все (мощность двух) блоков размером от 512 байт до 512 кБ давали одинаковую скорость.Увеличение размера блока с 512 кБ до 1 МБ уменьшило скорость копирования примерно до 60%.Увеличение размера блока снова увеличивало скорость, но никогда не возвращалось к скорости использования небольших блоков.

Когда все скопированные данные были в кэш-памяти, (намного более быстрая) скорость копирования улучшалась сувеличение размеров блоков, выравнивание вокруг достижения блоков 32 кБ, а затем внезапное падение примерно до половины предыдущей скорости при переходе от блоков 256 кБ до 512 кБ, чтобы никогда не возвращаться к предыдущим скоростям.Я уменьшил размеры блоков чтения / записи в некоторых моих программах с 1 МБ до 32 КБ.

2 голосов
/ 27 марта 2011

Как правило, использование таких больших блоков мало что дает.

Предположим, что ваша операционная система супер наивна, и каждая операция чтения или записи требует поиска на жестком диске (на практике вы часто обнаруживаете, что записи ставятся в очередь, а чтения - буферизуются с упреждающим чтением, что снижает преимущество использования больших буферов код вашего приложения).

Тогда каждый блок стоит, скажем, 2x10 мс за два поиска (один для чтения и один для записи), и нет смысла увеличивать размер вашего блока, как только время для фактического чтения и записи существенно превышает это. Действительно быстрый HD может читать и записывать со скоростью 150 МБ / с, и в этом случае 10 мс будут соответствовать 1,5 МБ при чтении / записи, и вы получите небольшую выгоду для блоков размером свыше 15 МБ.

На практике, (1) ваше время поиска, вероятно, будет меньше, (2) ваша пропускная способность для чтения и записи, вероятно, будет больше, и (3) ваша ОС и оборудование накопителя, вероятно, будут кешировать и ставить в очередь вещи для вас; вы, вероятно, увидите, что размеры блоков выше 100 КБ или не принесут вам никакой пользы.

(Вы, вероятно, должны сравнить различные размеры блоков и посмотреть, что вы получите в своей собственной системе.)

0 голосов
/ 17 ноября 2011

Учитывая, что привод должен искать при смене дорожек, не может ли размер блока, скажем, 63 x 512 = 32256, дать оптимальные результаты?

0 голосов
/ 27 марта 2011

Это довольно много. Учтите, что вы даже не начинаете записывать данные перед чтением 100 МБ, поэтому драйвер файловой системы даже не имеет возможности записать какой-либо файл назначения во время чтения. Диск может записывать части файла, которые проходят под заголовком при чтении исходного файла (см., Например, elevator seek ).

0 голосов
/ 27 марта 2011

Я думаю, что это зависит от объема свободной памяти, которую вы имеете.

Если вы будете использовать 100 Мбайты для копирования на машине, которая имеет, например, 30 МБ пустой памяти, тогда это займет гораздо больше временикопировать, используя меньший (20M) блок.

Если размер буфера для копирования превышает размер доступной свободной памяти, то из-за замены виртуальной памяти копирование будет выполняться медленнее, чем ожидалось.

...