Pendekatan yang saya gunakan dengan file XML saya yang besar - 130GB atau lebih besar - adalah dengan mengunggah seluruh file ke tidak masuk log sementara tabel dan dari sana saya mengekstrak konten yang saya inginkan. Unlogged tables
tidak crash-safe, tetapi jauh lebih cepat daripada yang dicatat, yang benar-benar sesuai dengan tujuan tabel sementara;-)
Perhatikan tabel berikut..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. Anda dapat mengimpor file 1GB ini menggunakan satu psql
baris dari konsol Anda (unix)..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Setelah itu yang Anda butuhkan hanyalah menerapkan logika Anda ke kueri dan mengekstrak informasi yang Anda inginkan. Bergantung pada ukuran tabel Anda, Anda dapat membuat tabel kedua dari SELECT
, misalnya:
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%'
Sesuaikan string_to_array
fungsi dan WHERE
klausa untuk logika Anda! Opsional Anda dapat mengganti beberapa LIKE
operasi ke satu SIMILAR TO
.
.. dan data Anda akan siap untuk dimainkan dengan:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Setelah data Anda diekstraksi, Anda dapat DROP TABLE tmp;
untuk mengosongkan beberapa ruang disk;)
Bacaan lebih lanjut:COPY
, PostgreSQL array functions
dan pattern matching