2010-10-18 46 views
7

Tôi đang sử dụng Python để lưu hàng dữ liệu theo hàng ... nhưng điều này cực kỳ chậm!Cách di chuyển tệp CSV sang Sqlite3 (hoặc MySQL)? - Python

CSV chứa dòng 70million, và với kịch bản của tôi Tôi chỉ có thể lưu trữ 1thousand một giây.


Đây là những gì kịch bản của tôi trông giống như

reader = csv.reader(open('test_results.csv', 'r')) 
for row in reader: 
    TestResult(type=row[0], name=row[1], result=row[2]).save() 

Tôi nghĩ rằng để thử nghiệm tôi có thể phải xem xét liệu MySQL hoặc PostgreSQL.

Bất kỳ ý tưởng hay mẹo nào? Đây là lần đầu tiên tôi xử lý lượng dữ liệu khổng lồ như vậy. :)

+0

sqlite chậm hơn so với mysql. MongoDB thường nhanh hơn để chèn, mặc dù nó có những hạn chế khác –

+0

'TestResult' là gì? Bạn đã không hiển thị bất kỳ cuộc gọi thực tế nào đến sqlite3, do đó, hơi khó để nhận xét về mã như nó đứng. Thời gian đọc ban đầu là gì nếu bạn bỏ qua 'save()' và sau đó nếu bạn thay thế cấu trúc TestResult bằng 'pass'? –

+0

Testresult là mô hình phân lớp của mô hình Django ORM – RadiantHex

Trả lời

3

Tôi không biết nếu điều này sẽ tạo sự khác biệt đủ lớn, nhưng kể từ khi bạn' tái xử lý với Django ORM tôi có thể đề xuất những điều sau đây:

  1. Đảm bảo rằng DEBUG là sai trong tập tin cài đặt Django của bạn, vì nếu không bạn sẽ lưu trữ mọi truy vấn trong bộ nhớ.
  2. Đặt logic của bạn trong một chức năng chính và bọc nó trong trang trí django.db.transactions.commit_on_success. Điều đó sẽ ngăn chặn mỗi hàng từ cần giao dịch riêng của nó, mà đáng kể sẽ đẩy nhanh quá trình.
  3. Nếu bạn biết rằng tất cả các hàng trong tệp không tồn tại trong cơ sở dữ liệu, hãy thêm force_insert = True vào lệnh gọi hàm save() của bạn. Điều này sẽ giảm một nửa số cuộc gọi đến sqlite cần thiết.

Những đề xuất này có thể sẽ tạo ra sự khác biệt lớn hơn nếu bạn thấy mình sử dụng DBMS máy khách-máy chủ.

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