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


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_byteagithub.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.