PostgreSQL बायटिया बनाम स्मॉलिंट []


9

मैं एक PostgreSQL डेटाबेस में बड़े (100Mb - 1 GB) मल्टी-चैनल टाइम-सीरीज डेटा आयात करना चाह रहा हूं। डेटा EDF प्रारूप फ़ाइलों से आता है जो डेटा को आमतौर पर कुछ सेकंड में "रिकॉर्ड" या "युग" में बदल देता है। प्रत्येक एपॉच का रिकॉर्ड डेटा के प्रत्येक चैनल के लिए छोटे पूर्णांकों के अनुक्रमिक सरणियों के रूप में संकेत रखता है।

मुझे डेटाबेस में फ़ाइलों को स्टोर करने के लिए अनिवार्य है, सबसे खराब स्थिति में BLOB के रूप में। यह देखते हुए, मैं उन विकल्पों की जांच करना चाहूंगा जो मुझे डेटाबेस के भीतर डेटा के साथ कुछ और करने की अनुमति देंगे, जैसे सिग्नल डेटा पर आधारित प्रश्नों की सुविधा।

मेरी प्रारंभिक योजना डेटा को एक पंक्ति प्रति युग रिकॉर्ड के रूप में संग्रहीत करना है। मैं जो वजन करने की कोशिश कर रहा हूं वह यह है कि क्या वास्तविक सिग्नल डेटा को बायटिया या स्मॉलिंट [] (या यहां तक ​​कि स्मॉलिंट [] []] प्रकारों के रूप में संग्रहीत किया जाए। किसी को भी एक दूसरे की सिफारिश कर सकता है? मुझे स्टोरेज और एक्सेस कॉस्ट में दिलचस्पी है। उपयोग एक बार डालने की संभावना है, कभी-कभी पढ़ें, कभी भी अपडेट न करें। यदि किसी को अधिक आसानी से एक कस्टम प्रकार के रूप में लपेटा गया था ताकि मैं रिकॉर्ड की तुलना करने के विश्लेषण के लिए कार्य जोड़ सकूं तो बहुत बेहतर।

इसमें कोई संदेह नहीं है कि मैं विस्तार से कम हूं, इसलिए मुझे जो भी आप स्पष्ट करना चाहते हैं उस पर टिप्पणी जोड़ने के लिए स्वतंत्र महसूस करें।


2
यह प्राधिकरण डेटा मॉडल में सरणी उपयोग के लिए कुछ समझदार उपयोगों में से एक हो सकता है, क्योंकि आप 24 से 28-बाइट पंक्ति ओवरहेड से बचने के लिए बहुत सारे डिस्क स्थान को बचाते हैं। Arrays भी संपीड़ित और लंबे समय तक लाइन से बाहर संग्रहीत किया जाता है।
क्रेग रिंगर

beldaz, जिस तरह से आपको डेटा को संग्रहित करना चाहिए, उसका उपयोग करने के लिए आपके पास कितनी योजना है, और कितनी बार। यदि डेटा को शायद ही कभी देखा जाता है, और आप हमेशा डेटा को प्रति-रिकॉर्ड आधार पर खींचना चाहते हैं, तो मुझे लगता है कि एक सरणी में प्रति रिकॉर्ड एक पंक्ति अच्छी समझ में आती है। हालाँकि, यदि आप कोई ऐसी क्वेरी करना चाहते हैं जो थोड़ी अधिक गहराई में हो, जैसे किसी दिए गए patient_id के लिए सभी रिकॉर्ड्स को खींचना, उदाहरण के लिए, तो शायद हम स्टोरेज स्ट्रक्चर में थोड़ा सुधार कर सकते हैं। आपके क्वेरी पैटर्न के बारे में कोई विचार?
क्रिस

@ क्रिस धन्यवाद। मैंने मेटाडेटा घटक को छोड़ दिया है क्योंकि यह बहुत छोटा है और एक अलग संबंध में रह सकता है। क्वेरी पैटर्न TBD हैं, लेकिन मैं एक ही समय में रिकॉर्ड की गई दो अलग-अलग फ़ाइलों की तुलना करना चाहता हूं, और साथ-साथ युगों से संकेतों को बाहर निकालना चाहता हूं।
बेलाज

@ क्रेगिंगर मैंने सरणी संपीड़न के बहुत सारे सबूत नहीं देखे। क्या इसे किसी तरह से सक्षम करने की आवश्यकता है?
बेलाज

जवाबों:


11

किसी भी उत्तर की अनुपस्थिति में मैंने इस मुद्दे को स्वयं आगे बढ़ाया है।

ऐसा लगता है कि उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन सभी आधार प्रकारों को शामिल कर सकते हैं, जिनमें शामिल हैंbytea और smallint[]इसलिए, यह प्रतिनिधित्व के विकल्प को बहुत प्रभावित नहीं करता है।

मैं एक PostgreSQL 9.4 सर्वर पर कई अलग-अलग अभ्यावेदन करने की कोशिश की, जो कि वेनिला कॉन्फ़िगरेशन के साथ विंडोज 7 लैपटॉप पर स्थानीय रूप से चल रहा है। वास्तविक सिग्नल डेटा को स्टोर करने के संबंध इस प्रकार थे।

पूरी फाइल के लिए बड़ी वस्तु

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

प्रति चैनल SMALLINT सरणी

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)
);

स्मालकैप 2 डी सरणी प्रति युग

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

BYTEA प्रति युग सरणी

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

मैंने तब जावा JDBC के माध्यम से इन संबंधों में से प्रत्येक में EDF फ़ाइलों का चयन आयात किया और प्रत्येक अपलोड के बाद डेटाबेस आकार में वृद्धि की तुलना की।

फाइलें थीं:

  • फ़ाइल ए: 166 चैनलों के 2706 युग, प्रत्येक चैनल 1024 नमूने (16385 नमूने प्रति युग), 85 एमबी
  • फ़ाइल बी: 11897 18 चैनलों के युग, प्रत्येक चैनल 1024 नमूने (प्रति युग 18432 नमूने), 418 एमबी
  • फ़ाइल सी: 2046 चैनलों के 11746 युग, प्रत्येक चैनल 64 से 1024 नमूने (प्रति युग 17088 नमूने), 382 एमबी

भंडारण लागत के संदर्भ में, यहां एमबी का आकार प्रत्येक मामले के लिए है: एमबी में भंडारण लागत

मूल फ़ाइल आकार के सापेक्ष, बड़े ऑब्जेक्ट लगभग 30-35% बड़े थे। इसके विपरीत, प्रत्येक युग को BYTEA या SMALLINT [] [] के रूप में संग्रहीत करना 10% से कम बड़ा था। प्रत्येक चैनल को अलग-अलग ट्यूपल के रूप में संग्रहीत करने से 40% की वृद्धि होती है, या तो BYTEA या SMALLINT [], इसलिए एक बड़ी वस्तु के रूप में संग्रहीत करने की तुलना में बहुत बुरा नहीं है।

एक चीज जिसकी मैंने शुरुआत में सराहना नहीं की थी, वह यह है कि " पोस्टग्रेज SQL में बहुआयामी सरणियों का प्रत्येक आयाम के लिए मिलान विस्तार होना चाहिए" । इसका मतलब यह है कि SMALLINT[][]प्रतिनिधित्व केवल तब काम करता है जब एक युग में सभी चैनलों में समान संख्या में नमूने होते हैं। इसलिए फ़ाइल C EpochArrayरिलेशन के साथ काम करने में विफल रहता है ।

एक्सेस कॉस्ट के रूप में, मैंने इसके साथ नहीं खेला है, लेकिन कम से कम डेटा डालने के मामले में शुरू में सबसे तेज़ प्रतिनिधित्व था EpochByteaऔर BlobFile, EpochChannelArrayसबसे धीमे के साथ , पहले दो के रूप में लगभग 3 बार ले रहा था।


अकादमिक दृष्टिकोण से, मुझे आपके परिणाम बहुत दिलचस्प लगे, लेकिन एक व्यावहारिक दृष्टिकोण से, बहुत चिंता का भंडारण आकार है? शायद आपके उपयोग के मामले में आपके पास बहुत सारे रिकॉर्ड हैं, और इसलिए भंडारण आपके सामने एक समस्या है? हालाँकि, इस संग्रहण प्रारूप में, एपोच (या चैनल, जब उपयुक्त स्कीमा में) के अलावा कोई भी लुकअप हर रिकॉर्ड के एक हिस्से को पढ़ने की आवश्यकता होगी। क्या यह आपके आवेदन के लिए ठीक है?
क्रिस

व्यावहारिक रूप से हाँ, यह निश्चित रूप से मेरे लिए महत्वपूर्ण है, क्योंकि मैं कई टीबी कच्ची फाइलों से निपटने की उम्मीद कर रहा हूं। जैसा कि यह पता चला है कि ओवरहेड में करंट मेरी अपेक्षा से कम है, लेकिन अगर यह किसी विशेष प्रतिनिधित्व के लिए 300% होता तो मैं निश्चित रूप से इससे बचता। क्वेरी करने के लिए मुझे युग और चैनल के अलावा किसी अन्य चीज के उपयोग की उम्मीद नहीं होगी।
बेलाज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.