2010-04-23 15 views
5

मैंने पहले से ही pgmex का उपयोग करने की कोशिश की। दुर्भाग्यवश यह libpq5 (matlab तुरंत क्रैश) के साथ काम नहीं करता है।मैटलैब डेटाबेस डेटाबेस के बिना मैटलैब से पोस्टग्रेस्क्ल डेटाबेस कैसे एक्सेस कर सकता हूं?

उत्तर

13

डेटाबेस टूलबॉक्स बिना matlab से postgres से कनेक्ट करने के लिए इसी तरह की कुछ करना:

% Add jar file to classpath (ensure it is present in your current dir) 
javaclasspath('postgresql-9.0-801.jdbc4.jar'); 

% Username and password you chose when installing postgres 
props=java.util.Properties; 
props.setProperty('user', '<your_postgres_username>'); 
props.setProperty('password', '<your_postgres_password>'); 

% Create the database connection (port 5432 is the default postgres chooses 
% on installation) 
driver=org.postgresql.Driver; 
url = 'jdbc:postgresql://<yourhost>:<yourport>\<yourdb>'; 
conn=driver.connect(url, props); 

% A test query 
sql='select * from <table>'; % Gets all records 
ps=conn.prepareStatement(sql); 
rs=ps.executeQuery(); 

% Read the results into an array of result structs 
count=0; 
result=struct; 
while rs.next() 
    count=count+1; 
    result(count).var1=char(rs.getString(2)); 
    result(count).var2=char(rs.getString(3)); 
    ... 
end 
+5

मेरे अनुभव से, यूआरएल होना चाहिए: url = 'jdbc: postgresql: // : /'; ('' और ' 'के बीच बैकस्लैश एक आगे स्लैश होना चाहिए)। यह एक ही विंडोज 7 कंप्यूटर पर Matlab और PostgreSQL सर्वर चलाते समय है। –

+1

लिनक्स पर मेरे लिए वही है। बैकस्लैश काम नहीं करता है, आगे की ओर करता है। – luator

+0

मूल्यों को पढ़ने के बाद परिणामसेट को बंद करने की अनुशंसा की जाती है। बस rs.close() जोड़ें; ऐसा करने के लिए –

0

MYSQL(additional link) कम से कम एक शुरुआती बिंदु के रूप में आपके लिए काम करेगा?

+0

दुर्भाग्य से यह postgresql के साथ काम नहीं करता है। लेकिन शायद ओडीबीसी/जेडीबीसी के माध्यम से एक और सामान्य समाधान है? –

7

एक सामान्य समाधान के रूप में, आप सीधे जेडीबीसी का उपयोग कर सकते हैं। आधुनिक Matlabs सभी में एक JVM एम्बेडेड है। Matlab में अपने जावा क्लास्स्पैट पर Postgresql जेडीबीसी ड्राइवर JAR फ़ाइल प्राप्त करें और आप जेडीबीसी कनेक्शन और कथन ऑब्जेक्ट्स बना सकते हैं। "मदद javaclasspath" देखें।

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

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

संपादित करें: यदि आप कस्टम क्लासपाथ.txt का उपयोग करके अपने स्थिर जावा क्लासपाथ पर JAR प्राप्त करते हैं तो आप शायद स्वचालित ड्राइवर पंजीकरण सामग्री को सही तरीके से प्राप्त कर सकते हैं।

+0

हां, यह मेरे समाधान से काफी बेहतर काम करना चाहिए। – Jonas

1

मैं एसएसएल मोड के साथ matlab के साथ एक pgsql डेटाबेस से कनेक्ट एक समस्या थी। डेटाबेस टूलबॉक्स का उपयोग करना इस तरह कुछ होना चाहिए: conn = डेटाबेस ('dbname', 'username', 'password', 'org.postgresql.Driver', 'jdbc: postgresql: databaseURL: dbname: ssl = true & sslfactory = org.postgresql.ssl.NonValidatingFactory & ')

लेकिन मैं त्रुटि थी: ' घातक: पासवर्ड प्रमाणीकरण उपयोगकर्ता "उपयोगकर्ता नाम" के लिए विफल '

तो मैं अपनी स्क्रिप्ट का उपयोग करें और एक ही त्रुटि मिलती है।

मैं पंक्ति जोड़ने के लिए किया था

props.setProperty ('ssl', 'सच');

और सामान्य यूआरएल, एसएसएलफ़ैक्ट्री के साथ नहीं ... जैसा कि मैटलैब सहायता में कहा गया है।

तो यह अच्छा है, लेकिन मैं डेटाबेस टूलबॉक्स के फ़ंक्शन का उपयोग नहीं कर सकता ... अच्छा, इतना बड़ा सौदा नहीं!

मुझे यह पता लगाने के लिए कुछ समय लगा, तो शायद यह जानना उपयोगी हो सकता है कि अगर उन्हें SSL मोड में दूरस्थ डेटाबेस से कनेक्ट करने में भी समस्या हो रही है।

धन्यवाद!

6

सबसे पहले, प्रश्न में शीर्ष पर मौजूद लिंक पहले ही टूटा हुआ है।जहां तक ​​मुझे पता है, यह पुरानी pgmex लाइब्रेरी अब समर्थित नहीं है। लेकिन एक पूरी तरह से नया उच्च प्रदर्शन PostgreSQL क्लाइंट लाइब्रेरी PgMex सी में 100% लिखा गया है और नवीनतम PostgreSQL 9.6 libpq के विरुद्ध जुड़ा हुआ है।

जैसा कि पहले से ही बताया गया था, आप सीधे जेडीबीसी का उपयोग कर सकते हैं, लेकिन आईएमएचओ कम से कम प्रश्नों के निष्पादन को तेज करने के लिए उपलब्ध तरीकों में से एक का उपयोग करना बेहतर है। उदाहरण के लिए, आप अनौपचारिक Matlab वेबसाइट पर प्रकाशित एक दिलचस्प लेख "मैटलैब-जेडीबीसी एसक्यूएल प्रश्नों को तेज करना" में वर्णित कुछ लागू कर सकते हैं। PostgreSQL जेडीबीसी ड्राइवर के खराब प्रदर्शन के लिए मुख्य कारण देशी मैटलैब प्रारूपों (जावा ऑब्जेक्ट्स से मैटलैब और इसके विपरीत) से महत्वपूर्ण डेटा रूपांतरण ओवरहेड से जुड़ा हुआ है। लेकिन जेडीबीसी के पास कुछ सीमाएं हैं जिन्हें अनिवार्य रूप से बड़े डेटा सेट के लिए काम नहीं किया जा सकता है। उदाहरण के लिए, यदि आपको सरणी से निपटना है तो इसे आसानी से देखा जा सकता है। आइए मैटलैब डाटाबेस टूलबॉक्स से datainsert विधि के डेटा सम्मिलन प्रदर्शन की तुलना में निम्न तालिका को देखें (एक सीधे जेडीबीसी कनेक्शन के माध्यम से पोस्टग्रेएसक्यूएल के साथ काम करना, ताकि इसे जेडीबीसी-आधारित कनेक्टर के प्रासंगिक प्रतिनिधि के रूप में माना जा सके) batchParamExec सरणियों के मामले के लिए उल्लेख किया PgMex से:

 
+-----------+-----------+--------------+------------------+ 
| Number of | Data size | Time for |  Time for  | 
| tuples |   | datainsert | batchParamExec | 
|   |   | (sec.) |  (sec.)  | 
+-----------+-----------+--------------+------------------+ 
| 20000 | 23Mb | 37.0255 |  1.1217  | 
+-----------+-----------+--------------+------------------+ 
| 40000 | 46Mb | 72.4008 |  2.2669  | 
+-----------+-----------+--------------+------------------+ 
| 60000 | 69Mb | 112.4428 |  3.2055  | 
+-----------+-----------+--------------+------------------+ 
| 80000 | 92Mb |  n/a  |  4.2073  | 
+-----------+-----------+--------------+------------------+ 
| 100000 | 115Mb |  n/a  |  5.5277  | 
+-----------+-----------+--------------+------------------+ 
| 300000 | 346Mb |  n/a  |  14.3530  | 
+-----------+-----------+--------------+------------------+ 
| 600000 | 691Mb |  n/a  |  28.3156  | 
+-----------+-----------+--------------+------------------+ 
| 800000 | 922Mb |  n/a  |  38.2579  | 
+-----------+-----------+--------------+------------------+ 
| 1000000 | 1152Mb |  n/a  |  47.8714  | 
+-----------+-----------+--------------+------------------+ 
| 1200000 | 1382Mb |  n/a  |  56.6258  | 
+-----------+-----------+--------------+------------------+ 
| 1400000 | 1613Mb |  n/a  |  65.9764  | 
+-----------+-----------+--------------+------------------+ 
| 1750000 | 2016Mb |  n/a  |  82.1829  | 
+-----------+-----------+--------------+------------------+ 
| 2000000 | 2304Mb |  n/a  |  93.5854  | 
+-----------+-----------+--------------+------------------+ 

यहाँ n/a मात्रा में डेटा जो कारण "जावा ढेर स्मृति से बाहर" समस्या को देखते हुए डालने विधि के लिए से मेल खाती है, इन सभी प्रयोगों के लिए जावा ढेर आकार 939Mb के बराबर था । इन और परिणामों के परिणामों के लिए ग्राफिकल रूप में प्रस्तुत किए गए प्रयोगों के साथ-साथ प्रयोगों के और विवरण के लिए कृपया निम्नलिखित "Performance comparison of PostgreSQL connectors in Matlab" article देखें)।

इस प्रकार, यदि आपको सरल स्केलर प्रकार वाले डेटा से निपटना है और बहुत बड़ी मात्रा में नहीं है, तो जेडीबीसी पूरी तरह से आपको संतुष्ट कर सकती है। लेकिन अन्यथा यह बेहतर आईएमएचओ है जो ऊपर वर्णित पीजीएमएक्स जैसे libpq- आधारित समाधानों का उपयोग करने के लिए बेहतर है। पीजीएमएक्स के अलावा, उदाहरण के लिए, एक ओपन-सोर्स पैकेज मैक्सपोस्टग्रेस (आप इसे मैटलैब सेंट्रल वेबसाइट पर पा सकते हैं) सी ++ में लिखे गए हैं। यह लाइब्रेरी अपने टेक्स्ट प्रस्तुतीकरण (PQgetvalue libpq से फ़ंक्शन के माध्यम से) के आधार पर पार्स डेटा बेसिंग और केवल डेटा प्रकारों की एक सीमित सूची के लिए (वास्तव में, वे स्केलर संख्यात्मक और तार्किक, समय, तिथियां, टाइमस्टैम्प और अंतराल के साथ-साथ तार भी हैं , सरणी जैसे अधिक जटिल प्रकार फिर से दायरे से बाहर हैं)। लेकिन पाठ प्रतिनिधित्व के माध्यम से स्थानांतरण बहुत धीमा है और इसका उपयोग केवल बड़े डेटा सेट के लिए ही नहीं किया जा सकता है। पीजीएमएक्स से क्या चिंता है, यह लाइब्रेरी किसी भी पाठ पार्सिंग के बिना मैटलैब और पोस्टग्रेएसक्यूएल के बीच एक बहुत ही कुशल बाइनरी डेटा ट्रांसफर चैनल लागू करती है। इसके अलावा, सभी मैटलैब-फ्रेंडली और मूल तरीके से (मैट्रिस के रूप में, बहु-आयामी सरणी, संरचनाएं और मनमाने ढंग से अन्य मैटलैब स्वरूपों में किया जाता है)।

आइए उपरोक्त उत्तरों में से किसी एक से लिया गया उदाहरण पर आधारित बाद की लाइब्रेरी से निपटने के लिए संकेत दें, लेकिन पीजीएमएक्स का उपयोग करके पुनः लिखा गया है। अर्थात्, डेटा आयात निम्न कोड द्वारा कार्यान्वित किया जाता (हम मानते हैं कि सभी मापदंडों <> संकेत द्वारा चिह्नित के मूल्यों नीचे कोड में ठीक से करने के साथ ही है कि इसी टेबल पहले से ही डेटाबेस में मौजूद भर रहे हैं):

% Create the database connection 
dbConn=com.allied.pgmex.pgmexec('connect',[... 
    'host=<yourhost> dbname=<yourdb> port=<yourport> '... 
    'user=<your_postgres_username> password=<your_postgres_password>']); 

% A test query 
sql='select * from <table>'; % Gets all records 
pgResult=com.allied.pgmex.pgmexec('exec',dbConn,sql); % Perform this test query 

% Read the results 
nFields=com.allied.pgmex.pgmexec('nFields',pgResult); 
outCVec=cell(nFields,1); 
fieldSpecStr='%<field_type_1> %<field_type_2> ...'; 
inpCVec=num2cell(0:nFields-1); 
[outCVec{:}]=com.allied.pgmex.pgmexec('getf',pgResult,... 
    fieldSpecStr,inpCVec{:}); 

कृपया अपने इनपुट और आउटपुट तर्क (fieldSpecStr सहित) के प्रारूप से संबंधित विवरण के लिए PgMex वेबसाइट पर "getf" दस्तावेज़ देखें। outCVec के प्रत्येक तत्व में valueVec, isNullVec और isValueNullVec फ़ील्ड वाली संरचना शामिल है। इन सभी क्षेत्रों पहला आयाम retrived tuples की संख्या के साथ ही साथ एक आकार है, valueVec, संबंधित तालिका फ़ील्ड का मान हैं, जबकि isNullVec और isValueNullVec NULLs के संकेतक हैं।

+0

सावधान रहें: गैर-निशुल्क व्यक्तिगत उपयोग के लिए भी लाइसेंस की आवश्यकता है – ItsmeJulian

0

(अस्वीकरण: डेटाबेस टूलबॉक्स की जरूरत है)
यहाँ एक ready setup postgresql server एक matlab स्क्रिप्ट से करने के लिए एक पूर्ण उदाहरण है, उसके अनुसार डेटाबेस पैरामीटर्स को समायोजित:

%Set preferences with setdbprefs. 
setdbprefs('DataReturnFormat', 'cellarray'); 
setdbprefs('NullNumberRead', 'NaN'); 
setdbprefs('NullStringRead', 'null'); 


%Make connection to database. 
%Using JDBC driver. 
conn = database('mydb', 'USERNAME', 'YOURPASSWORD', 'Vendor',... 
    'POSTGRESQL', 'Server', 'SERVERIP', 'PortNumber', 5432); 

%Read data from database, just an example on weather table in mydb database 
curs = exec(conn, ['SELECT weather.city'... 
    ' , weather.temperature'... 
    ' FROM "mydb"."public".weather ']); 

curs = fetch(curs); 
close(curs); 

%Assign data to output variable 
untitled = curs.Data; 

%Close database connection. 
close(conn); 

%Clear variables 
clear curs conn 

आपका उपयोगकर्ता LOGIN अधिकार भूमिका की जरूरत है और उपयोग कर सकेंगे टेबल (GRANT)

संबंधित मुद्दे