Een benadering die ik gebruik met mijn grote XML-bestanden - 130 GB of groter - is om het hele bestand te uploaden naar een tijdelijke unlogged tabel en van daaruit extraheer ik de inhoud die ik wil. Unlogged tables
zijn niet crashveilig, maar zijn veel sneller dan ingelogde, wat helemaal past bij het doel van een tijdelijke tafel;-)
Gezien de volgende tabel ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. u kunt dit bestand van 1 GB importeren met een enkele psql
lijn van je console (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Daarna hoeft u alleen maar uw logica toe te passen om de gewenste informatie op te vragen en te extraheren. Afhankelijk van de grootte van je tafel, kun je een tweede tafel maken van een SELECT
, bijv.:
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%'
Pas de string_to_array
aan functie en de WHERE
clausule aan uw logica! Optioneel kun je deze meerdere LIKE
. vervangen bewerkingen met een enkele SIMILAR TO
.
.. en je gegevens zijn klaar om mee te spelen:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Zodra uw gegevens zijn geëxtraheerd, kunt u DROP TABLE tmp;
om wat schijfruimte vrij te maken;)
Verder lezen:COPY
, PostgreSQL array functions
en pattern matching