পোস্টগ্রিসএসকিউএল বাইটিয়া বনাম স্মার্টিন্ট []


9

আমি পোস্টগ্র্রেএসকিউএল ডাটাবেসে বড় (100Mb - 1 গিগাবাইট) মাল্টি-চ্যানেল টাইম-সিরিজ ডেটা আমদানি করতে চাইছি। EDF ফর্ম্যাট ফাইলগুলি থেকে ডেটা আসে যা প্রতিটি "সেকেন্ড" সাধারণত কয়েক সেকেন্ডের "রেকর্ডস" বা "মহাকাশ "গুলিতে ডেটা অংশ করে দেয়। প্রতিটি যুগের রেকর্ড সংক্ষিপ্ত পূর্ণসংখ্যার ক্রমিক অ্যারে হিসাবে ডেটা প্রতিটি চ্যানেলের জন্য সংকেত ধারণ করে।

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

আমার প্রাথমিক পরিকল্পনাটি হ'ল যুগের রেকর্ডের জন্য এক সারি হিসাবে ডেটা সংরক্ষণ করা। আমি যা বোঝার চেষ্টা করছি তা হ'ল আসল সিগন্যাল ডেটা বাইটিয়া বা স্মার্টিন্ট [] (বা এমনকি ছোট্ট [] []) প্রকার হিসাবে সংরক্ষণ করা উচিত। কেউ কি একে অপরের উপর একটি সুপারিশ করতে পারেন? আমি স্টোরেজ এবং অ্যাক্সেস ব্যয়গুলিতে আগ্রহী। ব্যবহার একবার সন্নিবেশ করা হতে পারে, মাঝেমধ্যে পড়ুন, আপডেট কখনও না। কেউ যদি খুব সহজেই একটি কাস্টম টাইপ হিসাবে গুটিয়ে রাখা হয় যে আমি রেকর্ডের তুলনা বিশ্লেষণের জন্য ফাংশন যুক্ত করতে পারি তবে আরও ভাল।

সন্দেহ নেই যে আমি বিশদে কম, তাই আপনি আমাকে কী স্পষ্ট করতে চান তা সম্পর্কে বিনা দ্বিধায় মন্তব্য করুন।


2
লেখক ডেটা মডেলটিতে অ্যারের ব্যবহারের জন্য এটি কয়েকটি বুদ্ধিমান ব্যবহারগুলির মধ্যে একটি হতে পারে, যেহেতু আপনি 24 থেকে 28-বাইট সারি ওভারহেড এড়িয়ে প্রচুর ডিস্কের জায়গা সংরক্ষণ করেন । অ্যারেগুলি সংকুচিত হয় এবং যথেষ্ট পরিমাণে লাইন বাইরে সঞ্চিত হয়।
ক্রেগ রিঞ্জার

বেলডাজ, আপনি যেভাবে ডেটা সঞ্চয় করবেন সেভাবে আপনার কীভাবে এটি অ্যাক্সেস করার পরিকল্পনা রয়েছে এবং কীভাবে প্রায়শই তা করা উচিত। যদি ডেটা খুব কমই জিজ্ঞাসিত হয় এবং আপনি সর্বদা প্রতি-রেকর্ডের ভিত্তিতে ডেটা টানতে চান, তবে আমি মনে করি একটি অ্যারেতে রেকর্ড প্রতি এক সারি ভাল বোঝায়। তবে, আপনি যদি কিছু জিজ্ঞাসা করতে চান যা কিছুটা গভীরভাবে গভীর হয় যেমন একটি প্রদত্ত রোগী_আইডির জন্য সমস্ত রেকর্ড আঁকানো, উদাহরণস্বরূপ, তবে সম্ভবত আমরা স্টোরেজ কাঠামোর সামান্য উন্নতির পরামর্শ দিতে পারি। আপনার ক্যোয়ারী নিদর্শন সম্পর্কে কোনও ধারণা?
ক্রিস

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

@ ক্রেইগ্রিঞ্জার আমি অ্যারে সংকোচনের খুব বেশি প্রমাণ দেখতে পাইনি। এটি কি কোনও উপায়ে সক্ষম করা দরকার?
বেলডাজ

উত্তর:


11

কোনও উত্তরের অভাবে আমি নিজেই আরও বিষয়টি অনুসন্ধান করেছি।

দেখে মনে হচ্ছে যে ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি সহ সমস্ত বেস প্রকারগুলি পরিচালনা করতে পারে byteaএবং smallint[]তাই, এটি উপস্থাপনের পছন্দকে বেশি প্রভাবিত করে না।

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

পুরো ফাইলের জন্য বড় অবজেক্ট

CREATE TABLE BlobFile (
    eeg_id INTEGER PRIMARY KEY,
    eeg_oid OID NOT NULL
);

চ্যানেল প্রতি ছোট ছোট অ্যারে

CREATE TABLE EpochChannelArray (
    eeg_id INT NOT NULL,
    epoch INT NOT NULL,
    channel INT,
    signal SMALLINT[] NOT NULL,
    PRIMARY KEY (eeg_id, epoch, channel)
);

প্রতিটি পর্বে চ্যানেল প্রতি BYTEA

CREATE TABLE EpochChannelBytea (
    eeg_id INT NOT NULL,
    epoch INT NOT NULL,
    channel INT,
    signal BYTEA NOT NULL,
    PRIMARY KEY (eeg_id, epoch, channel)
);

যুগে যুগে ছোট 2D অ্যারে

CREATE TABLE EpochArray (
    eeg_id INT NOT NULL,
    epoch INT NOT NULL,
    signals SMALLINT[][] NOT NULL,
    PRIMARY KEY (eeg_id, epoch)
);

প্রতিযোগিতায় বাইওয়াইটিএ অ্যারে

CREATE TABLE EpochBytea (
    eeg_id INT NOT NULL,
    epoch INT NOT NULL,
    signals BYTEA NOT NULL,
    PRIMARY KEY (eeg_id, epoch)
);

আমি তখন জাভা জেডিবিসির মাধ্যমে এই সম্পর্কের প্রত্যেকটিতে ইডিএফ ফাইলগুলির একটি নির্বাচন আমদানি করেছিলাম এবং প্রতিটি আপলোডের পরে ডাটাবেসের আকারের বৃদ্ধির তুলনা করি।

ফাইলগুলি ছিল:

  • ফাইল এ: ১ channels টি চ্যানেলের ২২০po সূত্র, প্রতিটি চ্যানেল 1024 নমুনা (প্রতি পর্বে 16385 নমুনা), 85 এমবি
  • বি বি: 11897 18 টি চ্যানেলের যুগ, প্রতিটি চ্যানেল 1024 নমুনা (প্রতি পর্বে 18432 নমুনা), 418 এমবি
  • সি সি: 20 টি চ্যানেলের 11746 যুগের প্রতিটি চ্যানেল 64৪ থেকে ১০২৪ টি নমুনা (প্রতি পর্বে 17088 নমুনা), 382 এমবি

স্টোরেজ ব্যয়ের ক্ষেত্রে, প্রতিটি ক্ষেত্রে এমবিতে মাপের আকারটি এখানে রয়েছে: এমবিতে স্টোরেজ ব্যয়

মূল ফাইলের আকারের সাথে সম্পর্কিত, বড় অবজেক্টগুলি প্রায় 30-35% বড় ছিল। বিপরীতে, প্রতিটি যুগকে BYTEA বা SMALLINT হিসাবে সংরক্ষণ করা [] [] 10% এর চেয়ে কম বড় ছিল। প্রতিটি চ্যানেলকে আলাদা টিউপল হিসাবে সংরক্ষণ করা 40% বৃদ্ধি দেয়, উভয়ই BYTEA বা SMALLINT [] হয়, এটি কোনও বৃহত অবজেক্ট হিসাবে সংরক্ষণের চেয়ে খারাপ নয়।

একটি জিনিস যা আমি প্রথমে প্রশংসা করি নি তা হ'ল পোস্টগ্রেএসকিউএলে "বহুমাত্রিক অ্যারেগুলির প্রতিটি মাত্রার জন্য মেলানো এক্সটেন্টস থাকতে হবে" । এর অর্থ এই যে SMALLINT[][]উপস্থাপনাটি কেবল তখনই কাজ করে যখন কোনও যুগের সমস্ত চ্যানেলের একই সংখ্যার নমুনা থাকে। সুতরাং ফাইল সি EpochArrayসম্পর্কের সাথে কাজ করতে ব্যর্থ ।

এক্সেস খরচ যেমন নিরিখে আমি এই সাথে প্রায় খেলেছে না, কিন্তু অন্তত তথ্য ঢোকাতে পরিপ্রেক্ষিতে প্রাথমিকভাবে দ্রুততম উপস্থাপনা ছিল EpochByteaএবং BlobFileসঙ্গে EpochChannelArrayধীরতম, যেমন প্রথম দুই যতদিন 3 বার সম্পর্কে গ্রহণ।


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

ব্যবহারিকভাবে হ্যাঁ, এটি অবশ্যই আমার পক্ষে গুরুত্বপূর্ণ, কারণ আমি বেশ কয়েকটি টিবি কাঁচা ফাইল নিয়ে কাজ করার প্রত্যাশা করছি। যেহেতু এটি দেখা যাচ্ছে যে ওভারহেডের বর্তমানটি আমার প্রত্যাশার চেয়ে কম, তবে এটি যদি একটি নির্দিষ্ট উপস্থাপনার জন্য 300% হত তবে আমি অবশ্যই এড়াতে পারতাম। অনুসন্ধানের ক্ষেত্রে আমি যুগ এবং চ্যানেল ব্যতীত অন্য কোনও কিছু দ্বারা অ্যাক্সেসের আশা করব না।
বেলডাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.