2012-09-28 40 views
7

Tôi thấy rất nhiều ví dụ về nhập CSV vào một db PostgreSQL, nhưng những gì tôi cần là một cách hiệu quả để nhập 500.000 CSV vào một db PostgreSQL đơn. Mỗi CSV có dung lượng trên 500KB (tổng cộng khoảng 272GB dữ liệu).Cách hiệu quả để nhập nhiều tệp csv vào PostgreSQL db

CSV được định dạng giống nhau và không có bản ghi trùng lặp (dữ liệu được tạo theo chương trình từ nguồn dữ liệu thô). Tôi đã được tìm kiếm và sẽ tiếp tục tìm kiếm trực tuyến cho các tùy chọn, nhưng tôi sẽ đánh giá cao bất kỳ hướng nào về việc này được thực hiện theo cách hiệu quả nhất có thể. Tôi có một số kinh nghiệm với Python, nhưng sẽ đào sâu vào bất kỳ giải pháp nào khác có vẻ phù hợp.

Cảm ơn!

+1

Cách nhanh nhất để nhập dữ liệu vào PostgreSQL là sử dụng 'lệnh COPY'. –

Trả lời

0

Rất nhiều dữ liệu bạn có ở đó. Tôi không chắc chắn 100% về Postgre, nhưng ít nhất MySQL cung cấp một số lệnh SQL, để cấp một csv trực tiếp vào một bảng. Điều này bỏ qua bất kỳ kiểm tra chèn và như vậy và là thatswhy nhiều hơn một đơn đặt hàng của cường độ nhanh hơn bất kỳ hoạt động chèn bình thường. Vì vậy, cách nhanh nhất có thể là tạo một số tập lệnh python đơn giản, thông báo cho máy chủ postgre của bạn, các tệp csv mà theo thứ tự đói khát vào các bảng vô tận của nó.

7

Nếu bạn bắt đầu bằng cách đọc các PostgreSQL guide "Populating a Database" bạn sẽ thấy một vài mẩu lời khuyên:

  1. tải dữ liệu trong một giao dịch duy nhất.
  2. Sử dụng COPY nếu có thể.
  3. Xóa chỉ mục, ràng buộc khóa ngoài vv trước khi tải dữ liệu và khôi phục chúng sau đó.

PostgreSQL của COPY statement đã hỗ trợ định dạng CSV:

COPY table (column1, column2, ...) FROM '/path/to/data.csv' WITH (FORMAT CSV) 

như vậy có vẻ như nếu bạn đang giảm giá tốt nhất không sử dụng Python ở tất cả, hoặc sử dụng Python chỉ để tạo ra các chuỗi yêu cầu của COPY báo cáo.

+0

Gareth - Tôi giả định từ câu trả lời của bạn rằng bạn không thể sử dụng các ký tự đại diện trong câu lệnh Sao chép? Từ những gì tôi có thể nói, tôi cần một số loại phương pháp lập trình để tạo danh sách các tệp và sau đó phát hành các lệnh Sao chép riêng lẻ. Hãy sửa tôi nếu tôi sai. Tôi hi vọng là tôi :). Sẽ dễ dàng hơn nhiều nếu tôi có thể phát hành lệnh Sao chép bằng ký tự đại diện * .csv – FredG

+0

Chắc chắn tạo chuỗi lệnh 'COPY' thật dễ dàng? Ví dụ, bạn có thể làm nó shell: '(cho FILE trong /path/to/*.csv; làm echo" bảng COPY (column1, column2, ...) FROM '$ FILE' WITH (FORMAT CSV); "; done)> import-commands.sql' –

+0

Không phải là một chút không hiệu quả?Tạo một tệp với 500.000 lệnh Sao chép? – FredG

0

tôi sử dụng php và postgres, và đọc file csv với php và đi xe một chuỗi theo định dạng sau:

{ {line1 column1, line1 column2, line1 column3} , { line2 column1,line2 column2,line2 column3} } 

Chăm sóc trong một giao dịch duy nhất bằng cách thông qua các tham số chuỗi chức năng postgresql.

Tôi có thể kiểm tra tất cả hồ sơ, định dạng, lượng dữ liệu, v.v ... và nhận được kết quả nhập 500.000 bản ghi trong khoảng 3 phút.

Để đọc dữ liệu trong chức năng postgresql:

DECLARE 
    d varchar[]; 
BEGIN 

    FOREACH d SLICE 1 IN ARRAY p_dados 
    LOOP 


    INSERT INTO schema.table (
     column1, 
     column2, 
     column3, 
    ) 
    VALUES ( 
     d[1], 
     d[2]::INTEGER, -- explicit conversion to INTEGER 
     d[3]::BIGINT, -- explicit conversion to BIGINT 
    );   
    END LOOP; 

    END; 
Các vấn đề liên quan