Một cách tiếp cận mà tôi sử dụng với các tệp XML lớn của mình - 130GB hoặc lớn hơn - là tải toàn bộ tệp lên một tệp đã mở khóa tạm thời bảng và từ đó tôi trích xuất nội dung tôi muốn. Unlogged tables
không an toàn với sự cố, nhưng nhanh hơn nhiều so với các bảng đã ghi, điều này hoàn toàn phù hợp với mục đích của một bảng tạm thời;-)
Xem xét bảng sau ..
CREATE UNLOGGED TABLE tmp (raw TEXT);
.. bạn có thể nhập tệp 1GB này bằng một psql
từ bảng điều khiển của bạn (unix) ..
$ cat 1gb_file.txt | psql -d db -c "COPY tmp FROM STDIN"
Sau đó, tất cả những gì bạn cần là áp dụng logic của mình để truy vấn và trích xuất thông tin bạn muốn. Tùy thuộc vào kích thước bảng của bạn, bạn có thể tạo bảng thứ hai từ SELECT
, ví dụ:
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%'
Điều chỉnh string_to_array
và WHERE
mệnh đề logic của bạn! Theo tùy chọn, bạn có thể thay thế nhiều LIKE
này các thao tác với một SIMILAR TO
.
.. và dữ liệu của bạn sẽ sẵn sàng để phát với:
SELECT * FROM t;
operation | tmst | txt
-----------+---------------------+------------------------------------------------------------------
DEBUG | 2017-03-23 10:02:27 | ghtorrent-40 -- ghtorrent.rb:Repo EFForg/https-everywhere exists
(1 Zeile)
Sau khi dữ liệu của bạn được giải nén, bạn có thể DROP TABLE tmp;
để giải phóng một số không gian đĩa;)
Đọc thêm:COPY
, Các hàm mảng array functions
và pattern matching