2012-01-08 31 views
5

Tôi hiện đang có một dự án đang chạy trên PiCloud có liên quan đến nhiều lần lặp của Bộ giải mã ODE. Mỗi phép lặp tạo ra một mảng NumPy gồm khoảng 30 hàng và 1500 cột, với mỗi lần lặp được nối vào cuối của mảng của các kết quả trước đó.Cách hiệu quả để viết một mảng NumPy lớn vào một tệp

Thông thường, tôi chỉ để những mảng khá lớn này được hàm trả về, giữ chúng trong bộ nhớ và xử lý tất cả chúng cùng một lúc. Ngoại trừ PiCloud có giới hạn khá hạn chế về kích thước của dữ liệu có thể được ra ngoài do hàm trả về, để giảm chi phí truyền tải. Đó là tốt, ngoại trừ điều đó có nghĩa là tôi sẽ phải khởi động hàng ngàn công việc, mỗi công việc đang chạy trên lặp lại, với chi phí đáng kể.

Có vẻ như giải pháp tốt nhất cho việc này là ghi đầu ra vào một tệp và sau đó thu thập tệp bằng cách sử dụng chức năng khác mà chúng có mà không có giới hạn chuyển.

Đặt cược tốt nhất của tôi để làm điều này chỉ cần bán nó vào một tệp CSV? Tôi có nên thêm vào tệp CSV mỗi lần lặp hay giữ tất cả trong một mảng cho đến khi kết thúc và sau đó chỉ cần viết một lần? Có một cái gì đó khủng khiếp thông minh tôi đang mất tích?

Trả lời

8

Trừ khi có lý do để các tệp trung gian có thể đọc được bằng con người, hãy làm không sử dụng CSV, vì điều này chắc chắn sẽ liên quan đến việc mất chính xác.

Hiệu quả nhất có thể là tofile (doc) được thiết kế để đưa nhanh tệp vào đĩa khi bạn biết tất cả các thuộc tính của dữ liệu trước thời hạn.

Đối với nền tảng độc lập, nhưng cụ thể, tiết kiệm, bạn có thể sử dụng save (doc).

Khó xử và scipy cũng có hỗ trợ cho các định dạng dữ liệu khoa học khác nhau như HDF5 nếu bạn cần tính di động.

+0

Có thực sự không phải là một lý do để chúng có thể đọc được con người - chỉ được sử dụng để sử dụng tệp CSV để di chuyển xung quanh tập dữ liệu, nơi độ chính xác thực sự không phải là yếu tố (hầu hết mọi thứ đều là số nguyên). Điều này có vẻ là về những gì tôi đang tìm kiếm. – Fomite

2

Tôi khuyên bạn nên xem mô-đun pickle. Mô-đun pickle cho phép bạn tuần tự hóa các đối tượng python dưới dạng các chuỗi byte (ví dụ: các chuỗi). Điều này cho phép bạn ghi chúng vào một tập tin hoặc gửi chúng qua mạng, và sau đó phục hồi lại các đối tượng sau này.

+1

sử dụng cPickle thay vì dưa, nó là cách nhanh hơn. – Martlark

+0

dưa là tốt cho sử dụng ngay lập tức nhưng nó không nên được sử dụng khi bạn phải cổng nó trên các phiên bản của python (nó không có tương thích ngược tức là 3.x không thể đọc dữ liệu nhị phân ngâm 2.x mặc dù những gì tài liệu nói) sử dụng định dạng npy bản địa để sumpy. (http://bugs.python.org/issue6784) – staticd

2

Hãy thử Joblib - Fast compressed persistence

Một trong những thành phần chính của joblib được đó là khả năng tồn tại đối tượng Python tùy ý, và đọc chúng trở lại rất nhanh. Nó đặc biệt hiệu quả đối với các thùng chứa làm việc nặng nhọc của họ với các mảng nặng nề. Bí quyết để đạt được tốc độ tuyệt vời đã được lưu trong các tập tin riêng biệt các mảng numpy, và tải chúng thông qua memmapping.

Edit: Newer (2016) blog entry on data persistence in Joblib

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