আমি কীভাবে একটি এলোমেলো বাইটিয়া তৈরি করতে পারি


18

আমি byteaপরীক্ষার ডেটা জনসাধারণের জন্য নির্বিচার দৈর্ঘ্যের (<1Gb) এর এলোমেলো ক্ষেত্র উত্পন্ন করতে সক্ষম হতে চাই ।

এটি করার সর্বোত্তম উপায় কী?

উত্তর:


20

পিএল / পিজিএসকিউএল লুপিং এবং বাইটিয়া কনটেনটেশনের প্রয়োজনীয়তা এড়াতে জ্যাক ডগলাসের উত্তরকে বাড়ানো, আপনি ব্যবহার করতে পারেন:

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

1
ঠিক আছে, আমি প্রায় একই সমাধান নিয়ে এসেছি, তবে কেবলমাত্র নিম্ন মানের জন্য পরীক্ষিত। সেখানে @ জ্যাকের সমাধানটি একটি পরিষ্কার বিজয়ী ছিল। এখানে থামতে না
— পারার

আপনাকে ধন্যবাদ - এটি দুর্দান্ত এবং উদ্বেগজনক বলে মনে হচ্ছে। আমার মনে FROM generate_series(0, $1);হয় হওয়া দরকার FROM generate_series(1, $1);। আপনি কি পুনরাবৃত্তি চেষ্টা করেছেন? আমার সীমিত পরীক্ষার দ্বারা বোঝা যাচ্ছে যে এটি আরও বেশি স্কেল করে:
— জ্যাক ডগলাস

2
আমি symlinking চেষ্টা /dev/urandomমধ্যে /var/lib/pgsql/dataএবং সঙ্গে এটি পড়া pg_read_file()পাগল পয়েন্ট বোনাসের জন্য, কিন্তু দুর্ভাগ্যবশত pg_read_file()সার্চ textএনকোডিং রূপান্তর মাধ্যমে ইনপুট, তাই এটি bytea পড়তে পারে না। আপনি যদি সত্যিই সর্বোচ্চ গতি চান, একটি Cবর্ধিত ফাংশন লিখুন যা বাইনারি ডেটা তৈরি করতে দ্রুত সিউডো-এলোমেলো নম্বর জেনারেটর ব্যবহার করে এবং বাফারের চারপাশে একটি বাইটিয়া ডাটাম গুটিয়ে রাখবে :-)
— ক্রেগ

1
স্থাপিত টুইট সি এক্সটেনশন সংস্করণ random_bytea। github.com/ringerc/scrapcode/tree/master/postgresql/…
— ক্রেগ

1
আর একটি দুর্দান্ত উত্তর! আসলে আমি এখনও অবধি দেখা সেরাগুলির মধ্যে একটি। আমি এক্সটেনশনটি পরীক্ষা করি নি, তবে আমি বিশ্বাস করি এটি বিজ্ঞাপন হিসাবে কাজ করে।
— এরউইন ব্র্যান্ডসটেটার

5

আমি নির্বিচারে দৈর্ঘ্যের এলোমেলো বাইটিয়া ক্ষেত্র উত্পন্ন করতে সক্ষম হতে চাই

এই ফাংশনটি এটি করবে তবে 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|
*/

এখানে ডিবিফিডল


প্রস্থ_বাকেটের দুর্দান্ত ব্যবহার। কুশলী।
— ক্রেগ রিঞ্জার

1
আমি পিএল / পিজিএসকিউএল এবং ব্যয়বহুল কনক্রিটেশন লুপ এড়াতে আপনার পদ্ধতির উন্নতি করেছি; নতুন উত্তর দেখুন। বাইটায় পিএল / পিজিএসকিউএল কনটেনটেশন লুপের পরিবর্তে স্ট্রিং_এগআর জেনারেট_সরিজ ব্যবহার করে আমি পারফরম্যান্সের 150 গুণ উন্নতি দেখতে পাচ্ছি।
— ক্রেগ রিঞ্জার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.