En metod jag använder med mina stora XML-filer - 130 GB eller större - är att ladda upp hela filen till en tillfällig ologgad tabell och därifrån extraherar jag det innehåll jag vill ha. Unlogged tables
är inte kraschsäkra, men är mycket snabbare än loggade, vilket helt passar syftet med en tillfällig tabell;-)
Med tanke på följande tabell ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. du kan importera den här filen på 1 GB med en enda psql
linje från din konsol (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Efter det är allt du behöver använda din logik för att fråga och extrahera den information du vill ha. Beroende på storleken på din tabell kan du skapa en andra tabell från en SELECT
, t.ex.:
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%'
Justera string_to_array
funktionen och WHERE
klausul till din logik! Alternativt kan du ersätta dessa flera LIKE
operationer till en enda SIMILAR TO
.
.. och din data skulle vara redo att spelas 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 din data har extraherats kan du DROP TABLE tmp;
för att frigöra lite diskutrymme;)
Ytterligare läsning:COPY
, PostgreSQL array functions
och pattern matching