पोस्टग्रेएसक्यूएल में एक्सएमएल फाइलों को आयात करने के शायद एक हजार तरीके हैं, लेकिन यहां एक विकल्प है जो मुझे लागू करने में काफी आसान लगता है और पहले से ही बड़े एक्सएमएल दस्तावेज़ों (120 जीबी +) के साथ परीक्षण किया जा चुका है।
अपनी एक्सएमएल फ़ाइल के आकार के आधार पर, इसे विभाजित करने पर विचार करें। ऐसा करने के लिए एक बढ़िया टूल है xml_split
. यह कमांड file.xml
को विभाजित करता है छोटी फ़ाइलों में अधिकतम 100MB:
xml_split -n 5 -l 1 -s 100MB file.xml
एक बार जब आप अपनी फ़ाइलों को उचित आकार में विभाजित कर लेते हैं, तो आप स्मृति समाप्त होने के जोखिम के बिना उन्हें आयात करना शुरू कर सकते हैं।
आइए निम्नलिखित XML फ़ाइल संरचना पर विचार करें ...
<?xml version="1.0"?>
<t>
<foo>
<id j="a">1</id>
<val>bar1</val>
</foo>
<foo>
<id j="b">8</id>
<val>bar1</val>
</foo>
<foo>
<id j="c">5</id>
<val>bar1</val>
</foo>
<foo>
<id j="b">2</id>
</foo>
</t>
... और निम्न लक्ष्य तालिका, जहां हम XML रिकॉर्ड डालेंगे।
CREATE TABLE t (id TEXT, entry XML);
कोड bellow XML फ़ाइलों को एक अस्थायी <में आयात करता है मजबूत>अनलॉग
तालिका और अननेस्ट
उन्हें तालिका में t
एक CTE का उपयोग करना
(खंड के साथ उर्फ) नोड द्वारा <foo>
. कमांड perl -pe 's/\n/\\n/g'
न्यूलाइन वर्णों को \\n
. से बदल देता है ताकि आपको Premature end of data
न मिले अपवाद:
#!/bin/bash
psql testdb -c "CREATE UNLOGGED TABLE tmp (entry xml);"
for f in /path/to/your/files/;do
cat $f | perl -pe 's/\n/\\n/g' |psql testdb -c "COPY tmp FROM STDIN;"
psql testdb -c "
WITH j AS (
SELECT UNNEST(XPATH('//t/foo',entry)) AS entry FROM tmp
)
INSERT INTO t
SELECT XPATH('//foo/id/text()',j.entry),j.entry FROM j;
TRUNCATE TABLE tmp;"
done
psql testdb -c "DROP TABLE tmp;"
और ये रहा आपका डेटा:
testdb=# SELECT * FROM t;
id | entry
-----+--------------------------
{1} | <foo> +
| <id j="a">1</id>+
| <val>bar1</val> +
| </foo>
{8} | <foo> +
| <id j="b">8</id>+
| <val>bar1</val> +
| </foo>
{5} | <foo> +
| <id j="c">5</id>+
| <val>bar1</val> +
| </foo>
{2} | <foo> +
| <id j="b">2</id>+
| </foo>
(4 Zeilen)