Un enfoque que uso con mis archivos XML grandes (130 GB o más) es cargar el archivo completo en un archivo temporal sin registrar. table y de ahí extraigo el contenido que quiero. Unlogged tables
no son a prueba de fallas, pero son mucho más rápidos que los registrados, lo que encaja totalmente con el propósito de una tabla temporal;-)
Considerando la siguiente tabla..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. puede importar este archivo de 1GB usando un solo psql
linea desde tu consola (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Después de eso, todo lo que necesita es aplicar su lógica para consultar y extraer la información que desea. Dependiendo del tamaño de su tabla, puede crear una segunda tabla desde un SELECT
, por ejemplo:
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 el string_to_array
función y el WHERE
cláusula a su lógica! Opcionalmente, puede reemplazar estos múltiples LIKE
operaciones a un solo SIMILAR TO
.
.. y sus datos estarían listos para jugar con ellos:
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 vez que se extraen los datos, puede DROP TABLE tmp;
para liberar algo de espacio en disco;)
Lectura adicional:COPY
, PostgreSQL array functions
y pattern matching