मैं Postgres में Array प्रकारों पर कुछ संख्यात्मक प्रसंस्करण करने का प्रयास कर रहा हूँ। मैंने पाया कि मैं पोस्टग्रेस पीएल/पायथन के भीतर नम्पी लाइब्रेरी का उपयोग करने में सक्षम हूं लेकिन ऑपरेशन मेरे उद्देश्यों के लिए बहुत धीरे-धीरे चलता है और पाइथन में सीधे या सी एक्सटेंशन का उपयोग करने की तुलना में बहुत धीमा होता है।

मेरा संदेह यह है कि Postgres Array Type -> Python List -> Numpy Array से जाने के लिए ओवरहेड हो सकता है और फिर वापसी पर उल्टा कर सकता है।

परीक्षण करने के लिए (और संभावित रूप से ठीक करने के लिए) मैं एक सी एक्सटेंशन बनाने की कोशिश कर रहा हूं जो पाइथन सूची से गुजरना छोड़ देगा और सीधे पोस्टग्रेस ऐरे से नम्पी ऐरे में परिवर्तित हो जाएगा और इसके विपरीत।

मैंने एक सी एक्सटेंशन बनाया है जो निम्नलिखित को परिभाषित करता है:

CREATE FUNCTION arr_to_np(val internal) RETURNS internal LANGUAGE C AS 'MODULE_PATHNAME', 'arr_to_np';

CREATE FUNCTION np_to_arr(val internal) RETURNS real[] LANGUAGE C 
AS 'MODULE_PATHNAME', 'np_to_arr';

CREATE TRANSFORM FOR real[] LANGUAGE plpythonu (
    FROM SQL WITH FUNCTION arr_to_np(internal),
    TO SQL WITH FUNCTION np_to_arr(internal)
);

मॉड्यूल समस्याओं के बिना लोड होता है लेकिन जब मैं इसे किसी फ़ंक्शन में उपयोग करने का प्रयास करता हूं

CREATE FUNCTION fn (a integer[])
  RETURNS integer
  TRANSFORM FOR TYPE real[] 
  AS $$  return a $$ LANGUAGE plpythonu;

मुझे मिलता है: त्रुटि: वास्तविक भाषा "plpythonu" प्रकार के लिए परिवर्तन मौजूद नहीं है

मेरा अतिथि यह है कि परिवर्तन आधार "वास्तविक" प्रकार पर लागू होने का प्रयास कर रहा है, न कि सरणी। क्या विशेष रूप से सरणियों के लिए परिवर्तन निर्दिष्ट करने का कोई तरीका है?

1
tarkmeper 19 अप्रैल 2019, 20:22

1 उत्तर

सबसे बढ़िया उत्तर

यह पता चला है कि यह संभव नहीं है।

lsyscache.c (get_transform_oid) में यह एक ट्रांसफॉर्म के प्रकार को उसके आधार प्रकार में बदल देता है जो "सरणी" को अलग कर देता है और इसलिए फ़ंक्शन हमेशा अंतर्निहित प्रकार पर लागू होता है।

यह देखने के लिए कि क्या मैं इस व्यवहार की अनुमति देने के लिए एक पैच रख सकता हूं, लेकिन वर्तमान में (पोस्टग्रेस <=11.0) आप सरणी ऑब्जेक्ट्स के लिए कस्टम ट्रांसफॉर्म नहीं बना सकते हैं।

0
tarkmeper 3 मई 2019, 14:07