जवाबों:
पीएल / पीजीक्यूएल लूपिंग और बाइटिया कॉन्टेनेशन की आवश्यकता से बचने के लिए जैक डगलस का जवाब बढ़ा सकते हैं, आप यह कर सकते हैं:
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';
यह एक साधारण SQL
फ़ंक्शन है जो PL / PgSQL से कॉल करने के लिए सस्ता है।
परिवर्तित एकत्रीकरण विधि के कारण प्रदर्शन में अंतर बड़े bytea
मूल्यों के लिए अपार है । हालांकि मूल फ़ंक्शन वास्तव में आकार <3x बाइट्स के लिए 3x तेज है, यह एक बड़े मूल्यों के लिए बहुत बेहतर है।
या C एक्सटेंशन फ़ंक्शन का उपयोग करें :
मैंने एक साधारण C एक्सटेंशन फ़ंक्शन के रूप में एक यादृच्छिक बाइटा जनरेटर लागू किया है। यह GitHub पर मेरे स्क्रैपकोड रिपॉजिटरी में है । वहां README देखें।
यह उपरोक्त SQL संस्करण के प्रदर्शन को कम करता है:
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);
है कि होना चाहिए FROM generate_series(1, $1);
। क्या आपने पुनरावर्तन की कोशिश की है? मेरे सीमित परीक्षण का तात्पर्य है कि यह तराजू बेहतर है:
/dev/urandom
में सहानुभूति रखने की कोशिश की , लेकिन दुर्भाग्य से एन्कोडिंग रूपांतरण के माध्यम से इनपुट को पढ़ता है , इसलिए यह पेटी को नहीं पढ़ सकता है। यदि आप वास्तव में अधिकतम गति चाहते हैं, तो एक विस्तार फ़ंक्शन लिखें जो बाइनरी डेटा का उत्पादन करने के लिए एक तेज़ छद्म-यादृच्छिक संख्या जनरेटर का उपयोग करता है और बफ़र के चारों ओर बाइटी डेटम लपेटता है:/var/lib/pgsql/data
pg_read_file()
pg_read_file()
text
C
random_bytea
। github.com/ringerc/scrapcode/tree/master/postgresql/…
मैं मनमाने ढंग से लंबाई के यादृच्छिक बाइटा क्षेत्र उत्पन्न करने में सक्षम होना चाहूंगा
यह फ़ंक्शन करेगा, लेकिन 1Gb में लंबा समय लगेगा क्योंकि यह आउटपुट लंबाई के साथ रैखिक रूप से स्केल नहीं करता है:
create function random_bytea(p_length in integer) returns bytea language plpgsql as $$
declare
o bytea := '';
begin
for i in 1..p_length loop
o := o||decode(lpad(to_hex(width_bucket(random(), 0, 1, 256)-1),2,'0'), 'hex');
end loop;
return o;
end;$$;
उत्पादन परीक्षण:
select random_bytea(2);
/*
|random_bytea|
|:-----------|
|\xcf99 |
*/
select random_bytea(10);
/*
|random_bytea |
|:---------------------|
|\x781b462c3158db229b3c|
*/
select length(random_bytea(100000))
, clock_timestamp()-statement_timestamp() time_taken;
/*
|length|time_taken |
|-----:|:--------------|
|100000|00:00:00.654008|
*/
यहाँ dbfiddle