Criando um arquivo de tamanho grande em menos tempo

18

Eu quero criar um arquivo grande ~ 10G preenchido com zeros e valores aleatórios. Eu tentei usar:

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

Ele cria um arquivo de cerca de 2 GB e sai com o status de saída '0'. Eu não entendo o porquê?

Eu também tentei criar arquivo usando:

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

Demora cerca de 28 a 30 minutos para criá-lo. Mas eu quero que seja criado mais rápido. Alguém tem uma solução?

Também desejo criar vários arquivos com o mesmo padrão aleatório (pseudo) para comparação. Alguém sabe uma maneira de fazer isso?

skane
fonte
Bem-vindo ao AskUbuntu! Você provavelmente está recebendo um erro dddevido ao tamanho do bloco. Você pode olhar para este post stackoverflow.com/questions/6161823/…, que contém algumas boas respostas sobre como calcular o melhor tamanho de bloco, além de alguns scripts / programas de usuário e outras sugestões de uso dd.
No Time
1
Também dê uma olhada no stackoverflow.com/questions/257844/…
muru

Respostas:

12

Que tal usar fallocate, essa ferramenta nos permite pré-alocar espaço para um arquivo (se o sistema de arquivos suportar esse recurso). Por exemplo, alocando 5 GB de dados em um arquivo chamado 'exemplo', é possível:

fallocate -l 5G example

Isso é muito mais rápido que o dd e alocará o espaço muito rapidamente.

Colin Ian King
fonte
Esse arquivo contém dados aleatórios ou o que aconteceu no espaço em disco alocado?
26616 cprn
Ele conterá todos os zeros. Basicamente, o espaço é pré-alocado e, se você não modificar os dados, presume-se que seja zero.
Colin Ian King
Como isso pode ser mais rápido que o dumping /dev/zero?
Cprn
1
É muito rápido, porque é uma chamada do sistema que bloqueia a pré-localização (por exemplo, reserva o espaço, mas faz o mínimo de E / S), enquanto que a transferência de / dev / zero para um arquivo envolve uma carga de leitura / gravação.
Colin Ian King
Estou aumentando este. Uma última pergunta, porém ... eu estava usando truncateno passado e descobri que ele não aloca fisicamente o arquivo no dispositivo e apenas cria um arquivo grande e arbitrário até ser acessado, independentemente do espaço disponível. Tem certeza de que não é esse o caso fallocate? Gostaria de verificar isso, mas eu estou em um móvel ...
CPRN
9

Você pode usar ddpara criar um arquivo constituído apenas por zeros. Exemplo:

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

Isso é muito rápido, porque apenas um byte é realmente gravado no disco físico. No entanto, alguns sistemas de arquivos não suportam isso.

Se você deseja criar um arquivo contendo conteúdo pseudo-aleatório, execute:

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

Eu sugiro que você use 10M como tamanho do buffer ( bs). Isso ocorre porque 10M não é muito grande, mas ainda oferece um bom tamanho de buffer. Deve ser bem rápido, mas sempre depende da velocidade do disco e do poder de processamento.

xiaodongjie
fonte
1

Respondendo à primeira parte da sua pergunta:

Tentar escrever um buffer de 5 GB por vez não é uma boa ideia, pois seu kernel provavelmente não suporta isso. De qualquer forma, não lhe dará nenhum benefício de desempenho. Escrever 1 milhão de cada vez é um bom máximo.

cprn
fonte
0

Esta pergunta foi aberta há 5 anos. Eu apenas tropecei nisso e queria adicionar minhas descobertas.

Se você simplesmente usar

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

funcionará significativamente mais rápido, conforme explicado por xiaodongjie. Mas você pode torná-lo ainda mais rápido usando eatmydatacomo

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

O que eatmydatafaz é desativar o fsync, tornando o disco mais rápido.

Você pode ler mais sobre isso em https://flamingspork.com/projects/libeatmydata/ .

GMishx
fonte
1
A maneira como vejo ddé rápida o suficiente e é chamada libEAT-MY-DATA por um motivo.
karel