আমি bytea
পরীক্ষার ডেটা জনসাধারণের জন্য নির্বিচার দৈর্ঘ্যের (<1Gb) এর এলোমেলো ক্ষেত্র উত্পন্ন করতে সক্ষম হতে চাই ।
এটি করার সর্বোত্তম উপায় কী?
আমি bytea
পরীক্ষার ডেটা জনসাধারণের জন্য নির্বিচার দৈর্ঘ্যের (<1Gb) এর এলোমেলো ক্ষেত্র উত্পন্ন করতে সক্ষম হতে চাই ।
এটি করার সর্বোত্তম উপায় কী?
উত্তর:
পিএল / পিজিএসকিউএল লুপিং এবং বাইটিয়া কনটেনটেশনের প্রয়োজনীয়তা এড়াতে জ্যাক ডগলাসের উত্তরকে বাড়ানো, আপনি ব্যবহার করতে পারেন:
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
ফাংশন যা পিএল / পিজিএসকিউএল-এর চেয়ে কল করা সস্তা।
পরিবর্তিত সমন্বিত পদ্ধতির কারণে পারফরম্যান্সের পার্থক্য বৃহত্তর bytea
মানগুলির জন্য অপরিসীম । যদিও মুল ফাংশনটি আসলে মাপের জন্য ৫০ গতি অবধি দ্রুতগতিতে <50 বাইট, এটি বৃহত্তর মানগুলির জন্য আরও ভাল স্কেল করে।
অথবা একটি সি এক্সটেনশন ফাংশন ব্যবহার করুন :
আমি একটি সাধারণ সি এক্সটেনশন ফাংশন হিসাবে এলোমেলো বাইটিয়া জেনারেটর প্রয়োগ করেছি। এটি গিটহাবের আমার স্ক্র্যাপকোড সংগ্রহস্থলে রয়েছে । সেখানে পুনরায় দেখুন।
এটি উপরের এসকিউএল সংস্করণটির কার্যকারিতাটিকে নাক করে দেয়:
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
এনকোডিং রূপান্তর মাধ্যমে ইনপুট, তাই এটি bytea পড়তে পারে না। আপনি যদি সত্যিই সর্বোচ্চ গতি চান, একটি C
বর্ধিত ফাংশন লিখুন যা বাইনারি ডেটা তৈরি করতে দ্রুত সিউডো-এলোমেলো নম্বর জেনারেটর ব্যবহার করে এবং বাফারের চারপাশে একটি বাইটিয়া ডাটাম গুটিয়ে রাখবে :-)
random_bytea
। github.com/ringerc/scrapcode/tree/master/postgresql/…
আমি নির্বিচারে দৈর্ঘ্যের এলোমেলো বাইটিয়া ক্ষেত্র উত্পন্ন করতে সক্ষম হতে চাই
এই ফাংশনটি এটি করবে তবে 1 জিবি দীর্ঘ সময় নিতে পারে কারণ এটি আউটপুট দৈর্ঘ্যের সাথে রৈখিকভাবে স্কেল করে না:
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|
*/
এখানে ডিবিফিডল