En tilgang, jeg bruger med mine store XML-filer - 130 GB eller større - er at uploade hele filen til en midlertidig ulogget tabel og derfra udtrækker jeg det indhold, jeg ønsker. Unlogged tables
er ikke crash-sikre, men er meget hurtigere end loggede, hvilket helt passer til formålet med en midlertidig tabel;-)
I betragtning af følgende tabel ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. du kan importere denne 1GB fil ved hjælp af en enkelt psql
linje fra din konsol (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Derefter er alt hvad du behøver at anvende din logik til at forespørge og udtrække den information, du ønsker. Afhængigt af størrelsen på din tabel kan du oprette en anden tabel fra en SELECT
, f.eks.:
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%'
Juster string_to_array
funktionen og WHERE
klausul til din logik! Du kan eventuelt erstatte disse flere LIKE
operationer til en enkelt SIMILAR TO
.
.. og dine data ville være klar til at blive spillet med:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Når dine data er udtrukket, kan du DROP TABLE tmp;
for at frigøre noget diskplads;)
Yderligere læsning:COPY
, PostgreSQL array functions
og pattern matching