Un approccio che utilizzo con i miei file XML di grandi dimensioni (130 GB o più) consiste nel caricare l'intero file in un non registrato temporaneo tabella e da lì estraggo il contenuto che voglio. Unlogged tables
non sono a prova di crash, ma sono molto più veloci di quelli registrati, il che si adatta perfettamente allo scopo di una tabella temporanea;-)
Considerando la tabella seguente..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. puoi importare questo file da 1 GB utilizzando un singolo psql
riga dalla tua console (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Dopodiché, tutto ciò di cui hai bisogno è applicare la tua logica per interrogare ed estrarre le informazioni desiderate. A seconda delle dimensioni della tua tabella, puoi creare una seconda tabella da un SELECT
, ad esempio:
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%'
Regola il string_to_array
funzione e il WHERE
clausola alla tua logica! Facoltativamente puoi sostituire questi LIKE
multipli operazioni su un singolo SIMILAR TO
.
.. e i tuoi dati sarebbero pronti per essere giocati con:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Una volta estratti i tuoi dati puoi DROP TABLE tmp;
per liberare spazio su disco;)
Ulteriori letture:COPY
, PostgreSQL array functions
e pattern matching