Eu gostaria de poder gerar bytea
campos aleatórios de comprimento arbitrário (<1 GB) para preencher dados de teste.
Qual a melhor maneira para fazer isto?
fonte
Eu gostaria de poder gerar bytea
campos aleatórios de comprimento arbitrário (<1 GB) para preencher dados de teste.
Qual a melhor maneira para fazer isto?
Aprimorando a resposta de Jack Douglas para evitar a necessidade de loop PL / PgSQL e concatenação bytea, você pode usar:
CREATE OR REPLACE FUNCTION random_bytea(bytea_length integer)
RETURNS bytea AS $body$
SELECT decode(string_agg(lpad(to_hex(width_bucket(random(), 0, 1, 256)-1),2,'0') ,''), 'hex')
FROM generate_series(1, $1);
$body$
LANGUAGE 'sql'
VOLATILE
SET search_path = 'pg_catalog';
É uma SQL
função simples , mais barata de chamar do que PL / PgSQL.
A diferença no desempenho devido ao método de agregação alterado é imensa para bytea
valores maiores . Embora a função original seja até 3x mais rápida para tamanhos <50 bytes, esta é dimensionada muito melhor para valores maiores.
Ou use uma função de extensão C :
Eu implementei um gerador de bytea aleatório como uma função de extensão C simples. Está no meu repositório de scrapcode no GitHub . Veja o README lá.
Ele reduz o desempenho da versão SQL acima:
regress=# \a
regress=# \o /dev/null
regress=# \timing on
regress=# select random_bytea(2000000);
Time: 895.972 ms
regress=# drop function random_bytea(integer);
regress=# create extension random_bytea;
regress=# select random_bytea(2000000);
Time: 24.126 ms
FROM generate_series(0, $1);
precisa serFROM generate_series(1, $1);
. Você já tentou recursão? Meu teste limitado implica que isso é melhor:/dev/urandom
para/var/lib/pgsql/data
e lê-lo compg_read_file()
para o bônus pontos loucas, mas, infelizmente,pg_read_file()
lêtext
entrada através de uma conversão de codificação, por isso não pode ler bytea. Se você realmente quer velocidade máxima, escrever umaC
função de extensão que utiliza um gerador de números pseudo-aleatório rápido para produzir dados binários e enrole um dado bytea ao redor do tampão :-)random_bytea
. github.com/ringerc/scrapcode/tree/master/postgresql/…Esta função fará isso, mas 1Gb levará muito tempo porque não é dimensionado linearmente com o comprimento da saída:
teste de saída:
dbfiddle aqui
fonte