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

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 не слишком велик, но все же дает хороший размер буфера. Это должно быть довольно быстро, но это всегда зависит от скорости вашего диска и вычислительной мощности.

xiaodongjie
источник
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 за один раз - это хороший максимум.

CpRn
источник
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/ .

GMishx
источник
1
Для ddначала я достаточно быстр, и по какой-то причине он называется libEAT-MY-DATA.
Карел