Uma abordagem que uso com meus arquivos XML grandes - 130 GB ou mais - é carregar o arquivo inteiro em um arquivo temporário não registrado table e de lá extraio o conteúdo que quero.
Unlogged tables
não são à prova de falhas, mas são muito mais rápidos do que os registrados, o que atende totalmente ao propósito de uma tabela temporária;-) Considerando a tabela a seguir..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. você pode importar este arquivo de 1 GB usando um único
psql
linha do seu console (unix).. $ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Depois disso tudo o que você precisa é aplicar sua lógica para consultar e extrair as informações desejadas. Dependendo do tamanho da sua tabela, você pode criar uma segunda tabela a partir de um
SELECT
, por exemplo.: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%'
Ajuste o
string_to_array
função e a função WHERE
cláusula à sua lógica! Opcionalmente, você pode substituir esses múltiplos LIKE
operações para um único SIMILAR TO
. .. e seus dados estarão prontos para serem reproduzidos:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Uma vez que seus dados são extraídos, você pode
DROP TABLE tmp;
para liberar algum espaço em disco;) Leitura adicional:
COPY
, PostgreSQL array functions
e pattern matching