Создание файла большого размера за меньшее время


18

Я хочу создать большой файл ~ 10G, заполненный нулями и случайными значениями. Я пытался с помощью:

dd if=/dev/urandom of=10Gfile bs=5G count=10

Он создает файл размером около 2 ГБ и выходит со статусом выхода «0». Я не понимаю, почему?

Я также попытался создать файл, используя:

head -c 10G </dev/urandom >myfile

Это займет около 28-30 минут, чтобы создать его. Но я хочу, чтобы это создавалось быстрее. У кого-нибудь есть решение?

Также я хочу создать несколько файлов с одинаковым (псевдо) случайным рисунком для сравнения. Кто-нибудь знает способ сделать это?


Добро пожаловать в AskUbuntu! Вы, вероятно, получаете ошибку ddиз-за размера блока. Возможно, вы захотите взглянуть на этот пост stackoverflow.com/questions/6161823/… там есть несколько хороших ответов о том, как рассчитать наилучший размер блока, а также некоторые пользовательские скрипты / программы и другие предложения по их использованию dd.
Нет времени

1
Также посмотрите на stackoverflow.com/questions/257844/…
muru

Ответы:


12

Как насчет использования fallocate, этот инструмент позволяет нам предварительно выделить место для файла (если файловая система поддерживает эту функцию). Например, выделив 5 ГБ данных в файл с именем «example», можно сделать:

fallocate -l 5G example

Это намного быстрее, чем dd, и очень быстро выделит место.


Содержит ли этот файл случайные данные или содержит то, что произошло на выделенном дисковом пространстве?
cprn

Он будет содержать все нули. По существу, пространство уже выделено, и если вы не измените данные, оно будет считаться нулевым.
Колин Ян Кинг,

Как это может быть быстрее, чем сброс /dev/zero?
cprn

1
Это очень быстро, потому что это один системный вызов, который блокирует предварительное распределение (например, он резервирует пространство, но делает минимальный ввод-вывод), где, когда dd'ing из / dev / zero в файл включает в себя нагрузку чтения / записи.
Колин Ян Кинг,

Я поднимаю этот. Последний вопрос, хотя ... Я использовал truncateв прошлом и обнаружил, что он физически не распределяет файл на устройстве, а просто создает произвольный большой файл до тех пор, пока к нему нет доступа, независимо от доступного пространства. Вы уверены, что это не так с fallocate? Я бы проверил это, но я на мобильном ...
cprn

9

Вы можете использовать ddдля создания файла, состоящего исключительно из нулей. Пример:

dd if=/dev/zero of=zeros.img count=1 bs=1 seek=$((10 * 1024 * 1024 * 1024 - 1))

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

Если вы хотите создать файл, содержащий псевдослучайное содержимое, запустите:

dd if=/dev/urandom of=random.img count=1024 bs=10M

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


5

Используя dd, это должно создать файл размером 10 ГБ, заполненный случайными данными:

dd if=/dev/urandom of=test1 bs=1M count=10240

count в мегабайтах.

Источник: stackoverflow - Как создать файл с заданным размером в Linux?


Я только что попробовал dd if=/dev/urandom of=10Gfile bs=500M count=20, что дало мне 10237226010 байт чуть менее чем за 20 минут.
Йос

1

Отвечая на первую часть вашего вопроса:

Попытка записать буфер по 5 ГБ за раз не очень хорошая идея, поскольку ваше ядро, вероятно, не поддерживает это. Это не даст вам никакого выигрыша в производительности в любом случае. Написание 1M за один раз - это хороший максимум.


0

Этот вопрос был открыт 5 лет назад. Я просто наткнулся на это и хотел добавить свои выводы.

Если вы просто используете

dd if=/dev/urandom of=random.img count=1024 bs=10M

это будет работать значительно быстрее, как объясняет xiaodongjie. Но вы можете сделать это еще быстрее, используя eatmydataкак

eatmydata dd if=/dev/urandom of=random.img count=1024 bs=10M

Что eatmydataделает, это отключает fsync, заставляя диск записывать быстрее.

Вы можете узнать больше об этом на https://flamingspork.com/projects/libeatmydata/ .


1
Для ddначала я достаточно быстр, и по какой-то причине он называется libEAT-MY-DATA.
Карел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.