A maneira mais rápida de criar um arquivo de timestamps de nanossegundos exclusivos de 1MM

1

Meu exemplo atual (lento) é o seguinte:

for i in {1..1000000}; do echo "$(date +%s)$(date +%N)"; done > 1m-example.txt

Espero que haja uma maneira melhor. É uma loucura lenta.

    
por Larsenal 28.02.2014 / 01:42

2 respostas

2

Se forem apenas timestamps arbitrários, então não há necessidade real de date (eles são apenas números, certo?). Que tal algo como:

printf '1393548962358%s\n' {000000..999999} >1m-example.txt

Se não houver nenhum problema com eles sendo consecutivos. Outra ideia, mais próxima do original, é usar o seguinte:

yes now | head -n 1MB | date -f - +%s%N >1m-example.txt

Isso deixará algum espaço entre os números que variam com a entropia natural do sistema. Algo a se observar aqui é a dependência de hardware / implementação, pois os timestamps de nanossegundos completos podem não ser suportados, por exemplo, você pode ter apenas milissegundos ou até mesmo precisão. Nesse caso, você teria que repetir números com zeros no final provavelmente repetiria. Funciona bem para mim!

Atualizar

Como observação, se você estiver tentando criar carimbos de data / hora para serem lidos por date , será necessário adicionar um @ para que date os interprete como timestamps e não como datas / horas formatadas. Além disso, um ponto decimal é necessário, pois date só recebe registros de data e hora em segundos (e não em nanossegundos). Veja o exemplo a seguir (e comentários abaixo):

printf '@1393548962.358%s\n' {000000..000005} | date -f - '+%F %T.%N'
    
por 28.02.2014 / 01:59
1

Abaixo estão 2 métodos. O segundo método que usa seq + date para imitar o que sua pergunta estava pedindo. No entanto, esse método usando /dev/urandom e fold produzirá sequências numéricas aleatórias com o tamanho desejado.

Método 1. Usando / dev / urandom + fold

Você pode usar um comando como esse para gerar uma string aleatória com comprimento fixo.

$ tr -dc '0-9' </dev/urandom | fold -w 18 | head -n 1MB >1m-example.txt

Resultando neste tipo de resultado:

$ head -5 1m-example.txt
405295373332357365
317790052799018265
512803158528955068
838448126037265342
014951048334094344

Tempo:

real    0m30.261s
user    0m1.700s
sys     0m29.976s

Método # 2. Usando seq + date

Algo como isso gera dados em lote que podem ser canalizados para date em uma única chamada:

$ seq -f @%12.0f 1 1000000 | date -f - '+%s%N' > 1m-example.txt

O que está acontecendo?

$ seq -f @%12.0f 1 1000000 | head -5
@           1
@           2
@           3
@           4
@           5

Como resultado desse tipo de saída:

$ seq -f @%12.0f 1 1000000 | head -5 | date -f - '+%s%N'
1000000000
2000000000
3000000000
4000000000
5000000000

Tempo:

real    0m8.647s
user    0m3.547s
sys     0m5.971s

Mas isso parece completamente desnecessário, já que você parece querer apenas 1 milhão de dados aleatórios de um formato / tipo específico. Nesse caso, eu faria algo como a solução @Graeme usando printf com a expansão de chave do shell.

    
por 28.02.2014 / 02:01

Tags