Přístup, který používám u svých velkých souborů XML – 130 GB nebo větší – je nahrát celý soubor do dočasného nepřihlášeného tabulky a odtud extrahuji obsah, který chci. Unlogged tables
nejsou bezpečné při pádu, ale jsou mnohem rychlejší než protokolované, což zcela vyhovuje účelu dočasné tabulky;-)
S ohledem na následující tabulku ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. tento 1GB soubor můžete importovat pomocí jediného psql
linka z vaší konzole (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Poté vše, co potřebujete, je použít vaši logiku k dotazování a extrahování požadovaných informací. V závislosti na velikosti vaší tabulky můžete vytvořit druhou tabulku z SELECT
, např.:
CREATE TABLE t AS
SELECT
trim((string_to_array(raw,','))[1]) AS operation,
trim((string_to_array(raw,','))[2])::timestamp AS tmst,
trim((string_to_array(raw,','))[3]) AS txt
FROM tmp
WHERE raw LIKE '%DEBUG%' AND
raw LIKE '%ghtorrent-40%' AND
raw LIKE '%Repo EFForg/https-everywhere exists%'
Upravte string_to_array
funkce a WHERE
klauzule vaší logiky! Volitelně můžete nahradit tyto vícenásobné LIKE
operace na jeden SIMILAR TO
.
.. a vaše data budou připravena k přehrávání:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Jakmile jsou vaše data extrahována, můžete DROP TABLE tmp;
pro uvolnění místa na disku;)
Další čtení:COPY
, PostgreSQL array functions
a pattern matching