Подход, който използвам с моите големи XML файлове - 130GB или по-големи - е да кача целия файл във временен нерегистриран таблица и от там извличам съдържанието, което искам. Unlogged tables
не са безопасни при сривове, но са много по-бързи от регистрираните, което напълно отговаря на целта на временна таблица;-)
Като се има предвид следната таблица...
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. можете да импортирате този 1GB файл с помощта на един psql
линия от вашата конзола (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
След това всичко, от което се нуждаете, е да приложите своята логика към заявка и извличане на информацията, която искате. В зависимост от размера на вашата таблица, можете да създадете втора таблица от SELECT
, напр.:
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%'
Коригирайте string_to_array
функция и WHERE
клауза за твоята логика! По желание можете да замените тези няколко LIKE
операции към един SIMILAR TO
.
.. и вашите данни ще бъдат готови за игра с:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
След като вашите данни бъдат извлечени, можете да DROP TABLE tmp;
за да освободите малко дисково пространство;)
Допълнителна информация:COPY
, PostgreSQL array functions
и pattern matching