Une approche que j'utilise avec mes gros fichiers XML - 130 Go ou plus - consiste à télécharger le fichier entier dans un fichier temporaire non connecté table et de là j'extrait le contenu que je veux. Unlogged tables
ne sont pas anti-crash, mais sont beaucoup plus rapides que les tables connectées, ce qui convient parfaitement à l'objectif d'une table temporaire;-)
Considérant le tableau suivant ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. vous pouvez importer ce fichier de 1 Go en utilisant un seul psql
ligne depuis votre console (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Après cela, tout ce dont vous avez besoin est d'appliquer votre logique pour interroger et extraire les informations souhaitées. Selon la taille de votre tableau, vous pouvez créer un deuxième tableau à partir d'un SELECT
, par exemple :
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%'
Ajustez le string_to_array
fonction et le WHERE
clause à votre logique ! En option, vous pouvez remplacer ces multiples LIKE
opérations à un seul SIMILAR TO
.
.. et vos données seraient prêtes à être utilisées :
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Une fois vos données extraites, vous pouvez DROP TABLE tmp;
pour libérer de l'espace disque;)
Lectures complémentaires :COPY
, PostgreSQL array functions
et pattern matching