[identity profile] xobotun.livejournal.com posting in [community profile] useless_faq
Совершенно случайно возник вопрос: что жесткому диску будет быстрее прочитать: один файл на четыре гигабайта или 4096 файлов по мегабайту? А записать? И при каком количестве файлов наступит "точка вырождения"?

UPD. С чтением разобрались - зависит, как минимум от скорости вращения дисков и движения головок жёстких диков, фрагментации и количества служебной информации.
Похоже, что с записью будет то же самое.

Date: 2014-06-02 08:51 am (UTC)
From: [identity profile] magryba.livejournal.com
это в тестах дисков на тематических ресурсах подробно расписывают.

Date: 2014-06-02 09:21 am (UTC)
From: [identity profile] stairian.livejournal.com
При прочих равных быстрее 1 файл. Потому что для получения доступа к файлу надо сначала получить информацию о том, где он лежит, считать какие-нить атрибуты доступа и т.п. Это все лишнее время. Опыты не проводил, но навскидку на современной винде и современных дисках для 4096 файлов разница будет не слишком заметна. А вот где-нибудь 1 000 000 файлов по 4 000 байт будут читаться уже на порядки больше.

Date: 2014-06-02 09:46 am (UTC)
From: [identity profile] epc.livejournal.com
Если SSD диск, то примерно одинаково. Если классический, то 1 файл значительно быстрее, особенно, если когда он записывался на диске было много места и он не сильно фрагментирован. Все потому, что для каждого файла надо будет сначала прочитать где он лежит, а потом уже читать его самого = лишнее время на позиционирование читающих головок. А у SSD дисков такой проблемы нет - там рандомный доступ.

Date: 2014-06-02 11:09 am (UTC)
From: [identity profile] stairian.livejournal.com
Все равно, даже со случаем SSD нужно потратить время на поиск информации о файле, считать атрибуты файла, проверить наличие прав доступа и т.п.

Date: 2014-06-02 09:47 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
в общем случае быстрее будет прочесть 1 файл.

Если этот 1 файл фрагментирован на 4096 кусков, то будет примерно одинаково.

Если 1 файл нефрагментирован, и 4096 файлов расположена на диске друг за другом, то разницы в скорости будет немного.

Записать точно так же.

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

Date: 2014-06-02 11:11 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
ночью спать надо, много дефрагментацией не выиграешь, она имеет практический смысл только в одном случае, данные потом легче выковыривать с винта, если он того.

Date: 2014-06-02 03:52 pm (UTC)
From: [identity profile] karpion.livejournal.com
Про служебную информацию мы скромно промолчим?

Date: 2014-06-03 07:51 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
Тут вроде юздесфак а не сисадминсру не?

Date: 2014-06-03 10:46 am (UTC)
From: [identity profile] karpion.livejournal.com
Я привык отвечать на вопрос. Сообщество, в котором он размещён - не так уж важно.

Date: 2014-06-03 10:47 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
Какой вы серьезный, поди себе в зеркало никогда не улыбаетесь.

Date: 2014-06-03 10:50 am (UTC)
From: [identity profile] karpion.livejournal.com
Я в зеркало обычно не смотрюсь.
А дома на зеркале приклеена надпись: "другие не лучше". ;)

Ваш ответ игнорирует массу фактров. Например, не учитывается разница между HDD и SSD.

Date: 2014-06-03 10:54 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
Я придерживаюсь мнения что есть допустимые уровни упрощения.

Вопрос задан вроде бы конкретно по HDD. В принципе при желании я могу насыпать технических терминов и такого прочего как это сделали вы там ниже, но зачем?

Date: 2014-06-02 09:58 am (UTC)
From: [identity profile] arno1251.livejournal.com
Сам вопрос неинтересный, но тема "Производительность жёстких диков" - это пять

Date: 2014-06-02 10:18 am (UTC)
From: [identity profile] u-sual-suspect.livejournal.com
заголовок тянет на мем)

Date: 2014-06-02 10:51 am (UTC)
From: [identity profile] denisioru.livejournal.com
В общем рассуждении - большой файл читается быстрее, чем толпа маленьких. Разрыв значительно увеличивается при снижении размера мелких файлов до сотен и десятков килобайт.

Date: 2014-06-02 11:10 am (UTC)
From: [identity profile] vombatus123.livejournal.com
По разному. Всё зависит от физического расположения кусков файла в секторах жесткого диска. На чистом диске вероятно быстрее запишется-прочитается один большой файл, поскольку фрагменты разместятся в близлежащих секторах, и головка сможет считывать их подряд. Но на практике свободное место разбросано по всему диску, поэтому головке придётся скакать по всей пластине, а это очень замедляет процесс.

Date: 2014-06-02 01:18 pm (UTC)
From: [identity profile] sotona666.livejournal.com
Факторов, влияющих на скорость много, самые главные из них: тип файловой системы, размер буфера кэша винчестера, процессы, выполняющиеся параллельно с выполнениями тестов, ну и да, размер файлов.

Вот живые синтетические тесты на SSD дисках в каком-то RAID с файловой системой ext4:

Тесты записи: 1 файл размером 1Гб (увы, 4Гб сделать на этом сервере не смогу):
dd if=/dev/zero of=/tmp/testfile.bin bs=1G count=1
1073741824 bytes (1.1 GB) copied, 6.14261 s, 175 MB/s
1073741824 bytes (1.1 GB) copied, 8.30967 s, 129 MB/s
1073741824 bytes (1.1 GB) copied, 4.85202 s, 221 MB/s
1073741824 bytes (1.1 GB) copied, 7.95577 s, 135 MB/s

Тесты записи: 1024 файла размером 1Мб (время в наносекундах):
4.96257e+09
5.85231e+09
4.48971e+09
4.91984e+09


Тесты чтения для 1 файла размером 1Гб:
dd of=/dev/null if=/tmp/testfile.bin bs=1G count=1
1073741824 bytes (1.1 GB) copied, 2.16189 s, 497 MB/s
1073741824 bytes (1.1 GB) copied, 1.68176 s, 638 MB/s
1073741824 bytes (1.1 GB) copied, 2.13345 s, 503 MB/s
1073741824 bytes (1.1 GB) copied, 1.74146 s, 617 MB/s

Тесты чтения для 1024 файла размером 1Мб (время в наносекундах):
3.65431e+09
3.01503e+09
3.07641e+09
3.0315e+09


Т.е. получилось, что скорость записи вышла кое-где выше для файлов размером 1Мб, но чтение быстрее у 1Гб-файла.

Date: 2014-06-02 04:00 pm (UTC)
From: [identity profile] karpion.livejournal.com
Если файлы расположены на носителе с нулевой латентностью (Flash или RAM), когда время доступа нулевое (пренебрежимо мало по сравнению со временем передачи данных), то и тогда один большой файл будет читаться быстрее. Потому что у каждого файла есть служебные данные - имя, размер, атрибуты доступа. Т.е. один большой файл выигрывает даже по обработке его данных в CPU.

На носителе с высокой латентностью (HDD, CD/DVD) всё зависит от фрагментации и системы кэширования (особенно - от "упреждающего чтения" при чтении и "отложенной записи" при записи).

Точка вырождения на латентном носителе наступает примерно при размере файла равном размеру трека диска. Т.е. при количестве данных, которые диск способен передать за удвоенное среднее время доступа. Оценка оченть приблизительная.

Date: 2014-06-03 10:58 am (UTC)
From: [identity profile] wordsmsdnua.livejournal.com
Ваш коммент даже я чет не очень понял, можно же проще написать, но в целом возражений по сути я не нашел, выводы одинаковы.