কীভাবে সময় সিরিজের ডেটা সঞ্চয় করা যায়


22

আমার কাছে যা বিশ্বাস করি তা হল একটি টাইম সিরিজের ডেটা সেট (দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন) এর সাথে সম্পর্কিত মানগুলির একটি গুচ্ছ রয়েছে।

একটি উদাহরণ হ'ল কোনও গাড়ি মডেলিং করা এবং ভ্রমণের সময় এর বিভিন্ন বৈশিষ্ট্যগুলি ট্র্যাক করা। উদাহরণ স্বরূপ:

টাইমস্ট্যাম্প | গতি | দূরত্ব ভ্রমণ | তাপমাত্রা | ইত্যাদি

এই ডেটা সংরক্ষণ করার সর্বোত্তম উপায় কী হবে যাতে একটি ওয়েব অ্যাপ্লিকেশন দক্ষতার সাথে ক্ষেত্রগুলি সন্ধান করতে পারে যাতে সময়ের সাথে সাথে প্রতিটি ডেটা সেট করা সর্বোচ্চ ডেটা, মিনিট এবং প্লট করতে পারে?

আমি ডেটা ডাম্প পার্সিং এবং ফলাফলগুলি ক্যাশে করার একটি নির্লজ্জ পন্থা শুরু করেছি যাতে সেগুলি কখনই সংরক্ষণ করতে না হয়। এটি কিছুটা খেলে খোলার পরেও, মনে হচ্ছে মেমোরির সীমাবদ্ধতার কারণে এই সমাধানটি দীর্ঘমেয়াদী স্কেল করবে না এবং যদি ক্যাশে সাফ করা হয়, তবে সমস্ত ডেটা পুনরায় পার্স এবং পুনরায় ক্যাশে করা দরকার।

এছাড়াও, ধরে নিলাম যে প্রতি সেকেন্ডে 10+ ঘন্টা ডেটা সেটের বিরল সম্ভাবনার সাথে ডেটা ট্র্যাক করা হয়, সাধারণত প্রতিটি এন সেকেন্ডে নমুনা নির্ধারণ করে সেট করা ডেটা কাটা করার পরামর্শ দেওয়া হয়?

উত্তর:


31

সময় সিরিজের ডেটা সংরক্ষণ করার সত্যিই 'সেরা উপায়' নেই এবং এটি সত্যই বেশ কয়েকটি কারণের উপর নির্ভর করে। যাইহোক, আমি প্রধানত দুটি বিষয়গুলির উপর ফোকাস করতে যাচ্ছি, সেগুলির সাথে:

(1) এই প্রকল্পটি কতটা গুরুতর যে এটি স্কিমাটি অনুকূল করার জন্য আপনার প্রয়াসের প্রাপ্য?

(২) আপনার ক্যোয়ারী অ্যাক্সেসের ধরণগুলি আসলে কী হতে চলেছে?

এই প্রশ্নগুলি মাথায় রেখে আসুন কয়েকটি স্কিমা বিকল্পগুলি নিয়ে আলোচনা করা যাক।

ফ্ল্যাট টেবিল

একটি সমতল টেবিল ব্যবহার করার বিকল্পটিতে প্রশ্ন (1) এর সাথে আরও অনেক কিছু করার আছে , যেখানে এটি যদি কোনও গুরুতর বা বৃহত আকারের প্রকল্প না হয় তবে স্কিমার বিষয়ে খুব বেশি চিন্তা না করা আপনার পক্ষে খুব সহজ হবে এবং কেবল একটি সমতল টেবিল ব্যবহার করুন:

CREATE flat_table(
  trip_id integer,
  tstamp timestamptz,
  speed float,
  distance float,
  temperature float,
  ,...);

এমন কিছু ক্ষেত্রে নেই যেখানে আমি এই কোর্সটি সুপারিশ করতাম, কেবলমাত্র যদি এটি একটি ক্ষুদ্র প্রকল্প হয় যা আপনার বেশিরভাগ সময়ের ওয়ারেন্ট দেয় না।

মাত্রা এবং তথ্য

সুতরাং, যদি আপনি প্রশ্নের (1) বাধা মুছে ফেলেছেন এবং আপনি আরও বেশি পারফরম্যান্সের স্কিমা চান, তবে এটি বিবেচনা করার প্রথম বিকল্পগুলির মধ্যে একটি। এটিতে কিছু বেসিক নরমালাইজেশন রয়েছে তবে পরিমাপকৃত 'সত্য' পরিমাণ থেকে 'মাত্রিক' পরিমাণগুলি বের করা।

মূলত, আপনি ভ্রমণের তথ্য রেকর্ড করার জন্য একটি টেবিল চাইবেন,

CREATE trips(
  trip_id integer,
  other_info text);

টাইমস্ট্যাম্পগুলি রেকর্ড করার জন্য একটি টেবিল,

CREATE tstamps(
  tstamp_id integer,
  tstamp timestamptz);

এবং পরিশেষে আপনার সমস্ত পরিমাপ করা তথ্য, মাত্রা সারণীর বিদেশী কী উল্লেখ সহ (এটি meas_facts(trip_id)তথ্যসূত্র trips(trip_id)এবং meas_facts(tstamp_id)রেফারেন্স tstamps(tstamp_id))

CREATE meas_facts(
  trip_id integer,
  tstamp_id integer,
  speed float,
  distance float,
  temperature float,
  ,...);

এটি প্রথমে এটি সমস্ত সহায়ক বলে মনে হচ্ছে না, তবে আপনার যদি উদাহরণস্বরূপ সহস্র সাম্প্রতিক ট্রিপগুলি থাকে তবে তারা সকলে প্রতি সেকেন্ডে একবারে, দ্বিতীয়টিতে পরিমাপ গ্রহণ করে। সেক্ষেত্রে, আপনাকে কেবলমাত্র tstampsটেবিলের মধ্যে একটি একক প্রবেশিকা ব্যবহার না করে প্রতিটি ট্রিপের জন্য সময় স্ট্যাম্পটি পুনরায় রেকর্ড করতে হবে ।

ব্যবহারের কেস: এই ক্ষেত্রে ভাল হবে যদি এমন অনেকগুলি সমকালীন ট্রিপ থাকে যার জন্য আপনি ডেটা রেকর্ড করছেন, এবং পরিমাপের সমস্ত ধরণের একসাথে অ্যাক্সেস করতে আপনার আপত্তি নেই।

যেহেতু পোস্টগ্রাস সারি দ্বারা পাঠ করে, আপনি যে কোনও সময় যেমন চেয়েছিলেন, উদাহরণস্বরূপ, speedনির্দিষ্ট সময়সীমার উপরের পরিমাপগুলি আপনাকে অবশ্যই meas_factsটেবিল থেকে পুরো সারিটি পড়তে হবে, যা অবশ্যই কোনও অনুসন্ধানকে ধীর করবে, যদিও আপনি যে ডেটা সেটটি নিয়ে কাজ করছেন তা যদি হয় খুব বড় নয়, তবে আপনি তফাতটিও লক্ষ্য করবেন না।

আপনার পরিমাপকৃত সত্যগুলি আলাদা করা

শেষ অংশটিকে আরও খানিকটা প্রসারিত করতে, আপনি নিজের পরিমাপগুলি পৃথক টেবিলগুলিতে বিভক্ত করতে পারেন, উদাহরণস্বরূপ আমি গতি এবং দূরত্বের জন্য টেবিলগুলি দেখাব:

CREATE speed_facts(
  trip_id integer,
  tstamp_id integer,
  speed float);

এবং

CREATE distance_facts(
  trip_id integer,
  tstamp_id integer,
  distance float);

অবশ্যই, আপনি অন্যান্য পরিমাপে এটি কীভাবে বাড়ানো হতে পারে তা দেখতে পারেন।

কেস ব্যবহার করুন: সুতরাং এটি আপনাকে কোনও প্রশ্নের জন্য অসাধারণ গতি দেবে না, আপনি যখন একটি পরিমাপের ধরণ সম্পর্কে জিজ্ঞাসা করছেন তখন কেবল গতিতে কেবল রৈখিক বৃদ্ধি হবে। কারণ আপনি যখন গতি সম্পর্কে তথ্য সন্ধান করতে চান, আপনি কেবল speed_factsটেবিলের সারিগুলি পড়তে হবে, কেবলমাত্র টেবিলের এক সারিতে উপস্থিত সমস্ত অতিরিক্ত, অপ্রয়োজনীয় তথ্যের চেয়ে meas_facts

সুতরাং, আপনাকে কেবলমাত্র একটি পরিমাপের ধরণের সম্পর্কে প্রচুর পরিমাণে ডেটা পড়তে হবে, আপনি কিছু সুবিধা পেতে পারেন। আপনার প্রস্তাবিত 10 ঘন্টা ডেটা এক সেকেন্ডের ব্যবধানে, আপনি কেবল 36,000 সারি পড়তে চাইছেন, তাই এটি করার মাধ্যমে আপনি কখনই সত্যিকারের কোনও উপকার পাবেন না। যাইহোক, আপনি যদি প্রায় 5 ঘন্টা প্রায় 5,000 ভ্রমণের জন্য গতি পরিমাপের ডেটা খুঁজছিলেন, এখন আপনি 180 মিলিয়ন সারি পড়ার দিকে তাকিয়ে আছেন। যেমন একটি প্রশ্নের জন্য গতিতে রৈখিক বৃদ্ধি কিছু উপকার পেতে পারে, যতক্ষণ না আপনার একবারে পরিমাপের ধরণগুলির মধ্যে এক বা দুটি অ্যাক্সেস করতে হবে।

অ্যারে / এইচস্টোর / এবং টোস্ট

আপনার সম্ভবত এই অংশটি নিয়ে চিন্তা করার দরকার নেই, তবে আমি জানি যে ক্ষেত্রে এটি গুরুত্বপূর্ণ matter আপনি অ্যাক্সেস করার প্রয়োজন হলে বিশাল সময় সিরিজ ডেটার পরিমাণ, এবং আপনি জানেন আপনি এক বিশাল ব্লক এটা সব ব্যবহার করার দরকার, আপনি একটি কাঠামো যা ব্যবহার করতে হবে ব্যবহার করতে পারেন টোস্ট টেবিল , যা মূলত বৃহত্তর আপনার তথ্য সঞ্চয় করে, সংকুচিত অংশ। এটি যতক্ষণ না আপনার লক্ষ্যে সমস্ত ডেটা অ্যাক্সেস করা তত দ্রুত ডেটাতে অ্যাক্সেসের দিকে পরিচালিত করে।

একটি উদাহরণ বাস্তবায়ন হতে পারে

CREATE uber_table(
  trip_id integer,
  tstart timestamptz,
  speed float[],
  distance float[],
  temperature float[],
  ,...);

এই টেবিলটিতে tstartঅ্যারেতে প্রথম প্রবেশের জন্য টাইম স্ট্যাম্প সংরক্ষণ করা হবে এবং পরবর্তী প্রতিটি এন্ট্রি পরবর্তী দ্বিতীয়টির জন্য পড়ার মান হবে be এর জন্য আপনাকে অ্যাপ্লিকেশন সফ্টওয়্যারটির একটি অংশে প্রতিটি অ্যারে মানের জন্য প্রাসঙ্গিক সময় স্ট্যাম্প পরিচালনা করতে হবে।

আরেকটি সম্ভাবনা হ'ল

CREATE uber_table(
  trip_id integer,
  speed hstore,
  distance hstore,
  temperature hstore,
  ,...);

যেখানে আপনি আপনার পরিমাপের মানগুলিকে (কী, মান) জোড়া (টাইমস্ট্যাম্প, পরিমাপ) হিসাবে যুক্ত করেন।

কেস ব্যবহার করুন: পোস্টগ্র্রেএসকিউএল নিয়ে বেশি স্বাচ্ছন্দ্যবোধ করা এমন ব্যক্তির পক্ষে এটি সম্ভবত একটি বাস্তবায়ন এবং কেবলমাত্র যদি আপনি নিজের অ্যাক্সেস প্যাটার্নগুলি বাল্ক অ্যাক্সেসের নিদর্শনগুলির প্রয়োজন বলে নিশ্চিত হন।

উপসংহার?

বাহ, এটি আমার প্রত্যাশার চেয়ে অনেক বেশি সময় পেল, দুঃখিত :)

মূলত, এখানে অনেকগুলি বিকল্প রয়েছে, তবে আপনি সম্ভবত দ্বিতীয় বা তৃতীয়টি ব্যবহার করে আপনার বকের জন্য সবচেয়ে বড় ব্যাং পেতে পারেন, কারণ এগুলি আরও সাধারণ ক্ষেত্রে উপযুক্ত।

PS: আপনার প্রাথমিক প্রশ্নটি ইঙ্গিত দিয়েছে যে সমস্ত তথ্য সংগ্রহের পরে আপনি আপনার ডেটা প্রচুর পরিমাণে লোড করবেন। যদি আপনি আপনার পোস্টগ্রিএসকিউএল উদাহরণটিতে ডেটা প্রবাহিত করে থাকেন তবে আপনার ডেটা ইনজেশন এবং ক্যোয়ারী ওয়ার্কলোড উভয়ই পরিচালনা করার জন্য আপনাকে আরও কিছু কাজ করতে হবে, তবে আমরা এটি অন্য সময়ের জন্য ছেড়ে দেব। ;)


বাহ, বিস্তারিত উত্তরের জন্য ধন্যবাদ, ক্রিস! আমি 2 বা 3 বিকল্পটি ব্যবহার করে দেখব
অতিথি 82

আপনাকে শুভকামনা!
ক্রিস

বাহ, আমি যদি এই উত্তরটি দিতে পারতাম তবে 1000 বার ভোট দিতে পারব। বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ।
কিকোকোরোরোসো 5:37

1

এটির 2019 এবং এই প্রশ্নটি একটি আপডেট হওয়া উত্তর।

  • পন্থা সর্বোত্তম বা না তা হ'ল আমি আপনাকে বেঞ্চমার্ক এবং পরীক্ষার জন্য ছেড়ে দিচ্ছি তবে এখানে একটি পদ্ধতির উপায়।
  • টাইমসেল্ডব নামে একটি ডাটাবেস এক্সটেনশন ব্যবহার করুন
  • এটি স্ট্যান্ডার্ড পোস্টগ্রেএসকিউএল-তে ইনস্টল করা এবং সময় সিরিজটি যথাযথভাবে সংরক্ষণ করার সময় বিভিন্ন সমস্যার মুখোমুখি হয়

আপনার উদাহরণ গ্রহণ করে, প্রথমে পোস্টগ্রেএসকিউএল এ একটি সাধারণ টেবিল তৈরি করুন

ধাপ 1

CREATE TABLE IF NOT EXISTS trip (
    ts TIMESTAMPTZ NOT NULL PRIMARY KEY,
    speed REAL NOT NULL,
    distance REAL NOT NULL,
    temperature REAL NOT NULL
) 

ধাপ ২

  • টাইমসেল্ডব বিশ্বে হাইপারটেবল যাকে বলা হয় এটিতে পরিণত করুন।
  • সহজ কথায়, এটি একটি বৃহত টেবিল যা ধারাবাহিকভাবে কিছু সময়ের ব্যবধানের ছোট টেবিলগুলিতে বিভক্ত থাকে, এমন একটি দিন বলুন যেখানে প্রতিটি মিনি টেবিলটিকে একটি অংশ হিসাবে উল্লেখ করা হয়
  • আপনি যখন কোয়েরি পরিচালনা করেন তখন এই মিনি টেবিলটি স্পষ্ট হয় না যদিও আপনি এটি আপনার প্রশ্নের মধ্যে অন্তর্ভুক্ত করতে বা বাদ দিতে পারেন

    Create_hypertable নির্বাচন করুন ('ট্রিপ', 'ts', অংশ_কাল_মোত্তর => বিরতি '1 ঘন্টা', if_not_exists => সত্য);

  • উপরে আমরা যা করেছি তা হ'ল আমাদের ট্রিপ টেবিলটি নিয়ে যাওয়া, 'টিএস' কলামের ভিত্তিতে প্রতি ঘন্টা মিনি টুকরা টেবিলগুলিতে ভাগ করুন। আপনি যদি 10:00 থেকে 10:59 এর টাইমস্ট্যাম্প যোগ করেন তবে সেগুলিকে 1 টিতে যোগ করা হবে তবে 11:00 একটি নতুন অংশে .োকানো হবে এবং এটি অসীমভাবে চলে যাবে।

  • আপনি যদি অনির্দিষ্টভাবে ডেটা সঞ্চয় করতে না চান, আপনি 3 মাস ব্যবহারের চেয়ে পুরানো অংশগুলিও ড্রপ করতে পারেন

    ড্রপ_চঙ্কগুলি নির্বাচন করুন (বিরতি '3 মাস', 'ট্রিপ');

  • আপনি এই জাতীয় একটি কোয়েরি ব্যবহার করে আজ অবধি তৈরি হওয়া সমস্ত খণ্ডের একটি তালিকা পেতে পারেন

    খণ্ড_সারণী, টেবিল_বাইটস, সূচক_বাইটস, মোট_বাইটগুলি থেকে নির্বাচন করুন_সংযোগ_সাইজ ('ট্রিপ');

  • এটি আপনাকে আজ অবধি তৈরি সমস্ত মিনি টেবিলের একটি তালিকা দেবে এবং আপনি যদি এই তালিকা থেকে চান তবে আপনি সর্বশেষ মিনি টেবিলটিতে একটি ক্যোয়ারী চালাতে পারবেন

  • আপনি আপনার প্রশ্নগুলি অন্তর্ভুক্ত করতে, খণ্ডগুলি বাদ দিতে বা কেবলমাত্র শেষ এন অংশগুলিতে পরিচালনা করতে পারেন so

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.