Podejście, którego używam w przypadku moich dużych plików XML — 130 GB lub większych — polega na przesłaniu całego pliku do tymczasowego niezalogowanego tabeli i stamtąd wyciągam zawartość, którą chcę. Unlogged tables
nie są bezpieczne w przypadku awarii, ale są znacznie szybsze niż te, które są zalogowane, co całkowicie pasuje do celów tabeli tymczasowej;-)
Biorąc pod uwagę poniższą tabelę ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. możesz zaimportować ten plik 1GB za pomocą jednego psql
linia z konsoli (unix).
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Następnie wystarczy zastosować swoją logikę do zapytania i wyodrębnienia żądanych informacji. W zależności od rozmiaru tabeli możesz utworzyć drugą tabelę z SELECT
, np.:
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%'
Dostosuj string_to_array
funkcja i WHERE
klauzula do Twojej logiki! Opcjonalnie możesz zastąpić te wiele LIKE
operacje na pojedynczym SIMILAR TO
.
.. a Twoje dane będą gotowe do odtwarzania:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Po wyodrębnieniu danych możesz DROP TABLE tmp;
zwolnić trochę miejsca na dysku;)
Dalsza lektura:COPY
, PostgreSQL array functions
i pattern matching