Ein Ansatz, den ich bei meinen großen XML-Dateien verwende – 130 GB oder mehr – besteht darin, die gesamte Datei in ein temporäres nicht angemeldetes hochzuladen Tabelle und daraus extrahiere ich den gewünschten Inhalt. Unlogged tables
sind nicht absturzsicher, aber viel schneller als geloggte, was dem Zweck einer temporären Tabelle durchaus entgegenkommt;-)
Betrachtet man die folgende Tabelle ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. Sie können diese 1-GB-Datei mit einem einzigen psql
importieren Zeile von Ihrer Konsole (Unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Danach müssen Sie nur noch Ihre Logik anwenden, um die gewünschten Informationen abzufragen und zu extrahieren. Je nach Größe Ihrer Tabelle können Sie aus einem SELECT
eine zweite Tabelle erstellen , z. B.:
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%'
Passen Sie string_to_array
an Funktion und das WHERE
Klausel zu Ihrer Logik! Optional können Sie diese mehrfachen LIKE
ersetzen Operationen zu einem einzelnen SIMILAR TO
.
.. und Ihre Daten wären spielbereit:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Sobald Ihre Daten extrahiert sind, können Sie DROP TABLE tmp;
um Speicherplatz freizugeben;)
Weiterführende Literatur:COPY
, PostgreSQL array functions
und pattern matching