2010-11-08 35 views
10

Tôi cần trợ giúp để đưa ra quyết định. Tôi có nhu cầu chuyển một số dữ liệu trong ứng dụng của mình và phải lựa chọn giữa 3 công nghệ này. Tôi đã đọc về tất cả các công nghệ một chút (hướng dẫn, tài liệu) nhưng vẫn không thể quyết định ...Bộ đệm giao thức của Google, HDF5, So sánh NumPy (truyền dữ liệu)

Chúng so sánh như thế nào?

tôi cần sự hỗ trợ của siêu dữ liệu (khả năng tiếp nhận hồ sơ và đọc nó mà không có bất kỳ thông tin/file bổ sung), nhanh chóng đọc/viết các hoạt động, khả năng lưu trữ dữ liệu động sẽ là một cộng (như đối tượng Python)

Things Tôi đã biết:

  • NumPy là khá nhanh nhưng không thể lưu trữ dữ liệu động (như đối tượng Python). (Điều gì về siêu dữ liệu?)
  • HDF5 là rất nhanh, hỗ trợ các thuộc tính tùy chỉnh, rất dễ sử dụng, nhưng không thể lưu trữ các đối tượng Python. Ngoài ra HDF5 cũng lưu trữ dữ liệu NumPy một cách tự nhiên, vì vậy, IMHO, NumPy không có lợi thế hơn HDF5
  • Google Protocol Buffers hỗ trợ tự mô tả, khá nhanh (nhưng hỗ trợ Python kém ở thời điểm hiện tại, chậm và lỗi). CÓ THỂ lưu trữ dữ liệu động. Minuses - tự mô tả không hoạt động từ Python và tin nhắn> = 1 MB đang tuần tự hóa/deserializing không phải là rất nhanh (đọc "chậm").

PS: dữ liệu tôi cần phải chuyển là "kết quả của công việc" của NumPy/scipy (mảng, mảng của cấu trúc phức tạp, vv)

UPD: Truy cập chéo ngôn ngữ yêu cầu (C/C++/Python)

+0

Nếu bạn đang cân nhắc sử dụng HDF5, hãy sử dụng PyTables. http://www.pytables.org/moin Về cơ bản, nó cho phép bạn xây dựng các lớp để dễ dàng và nhanh chóng lưu trữ, tạo lại và truy vấn siêu dữ liệu và mảng cố định tới HDF5. Vì nó chỉ lưu trữ mọi thứ vào HDF5, bạn sẽ có thể dễ dàng truy cập mọi thứ trong C/C++ thông qua các thư viện thông thường. –

+0

Vâng, tôi biết về PyTables, thy rất dễ sử dụng và đa ngôn ngữ, nhưng chúng không cho phép tôi lưu trữ các đối tượng python ... –

Trả lời

11

Dường như có một mâu thuẫn nhỏ trong câu hỏi của bạn - bạn muốn có thể lưu trữ các đối tượng Python, nhưng bạn cũng muốn truy cập C/C++. Tôi nghĩ rằng bất kể bạn chọn sự lựa chọn nào, bạn sẽ cần chuyển đổi các cấu trúc dữ liệu Python lạ mắt của bạn thành nhiều cấu trúc tĩnh hơn như mảng.

Nếu bạn cần truy cập ngôn ngữ chéo, tôi khuyên bạn nên sử dụng HDF5 vì định dạng tệp được thiết kế đặc biệt độc lập với ngôn ngữ, hệ điều hành, kiến ​​trúc hệ thống (ví dụ: khi tải nó có thể chuyển đổi giữa người lớn và ít tự động) và đặc biệt nhắm vào người dùng làm tính toán khoa học/số. Tôi không biết nhiều về Bộ đệm giao thức của Google, vì vậy tôi thực sự không thể nhận xét quá nhiều về điều đó.

Nếu bạn quyết định đi với HDF5, tôi cũng khuyên bạn nên sử dụng h5py thay vì pytables. Điều này là do pytables tạo ra các tệp HDF5 với rất nhiều siêu dữ liệu bổ sung pythonic giúp đọc dữ liệu trong C/C++ nhiều hơn một chút, trong khi h5py không tạo ra bất kỳ tính năng bổ sung nào. Bạn có thể tìm thấy so sánh here và họ cũng cung cấp liên kết tới Câu hỏi thường gặp về các vấn đề về nội dung để bạn có thể quyết định xem phù hợp nhất với nhu cầu của bạn.

Một định dạng khác rất giống với HDF5 là NetCDF. Điều này cũng có ràng buộc Python, tuy nhiên tôi không có kinh nghiệm trong việc sử dụng định dạng này vì vậy tôi không thể thực sự bình luận ngoài việc chỉ ra rằng nó tồn tại và cũng được sử dụng rộng rãi trong máy tính khoa học.

+0

Cảm ơn bạn đã trả lời. Tôi biết rằng có lẽ không ai trong số 3 hoàn toàn có thể đáp ứng nhu cầu của tôi, đó là lý do tại sao tôi tạo ra câu hỏi ở đây, sự lựa chọn thực sự là một chút khó khăn. PS Đọc Google Buffers tài liệu ngày hôm qua và tìm thấy một điều thú vị ra khỏi đó: họ không được thiết kế để chuyển một lượng lớn dữ liệu (> 1MB), vì vậy suy nghĩ quyết định là về NumPY và HDF5 .. –

+1

Siêu dữ liệu PyTables bổ sung là rất kín đáo, một số thuộc tính bổ sung cho các tập dữ liệu. Bạn có thể tắt nó bằng cách cài đặt 'tables.parameters.PYTABLES_SYS_ATTRS = False' hoặc mở một tệp với đối số được đặt tên' PYTABLES_SYS_ATTRS = False'. – AFoglia

+0

Ngoài ra, hãy để tôi thêm rằng PyTables là rất dễ sử dụng, không giống như C/C++ API h5py dịch. Lợi ích của cách tiếp cận h5py là tìm hiểu nhanh hơn cả hai API nếu chúng tương tự nhau. – AFoglia

2

Tôi không biết về HDF5, nhưng bạn có thể lưu trữ đối tượng Python trong mảng NumPy, bạn chỉ mất tất cả chức năng quan trọng bằng cách không cho phép thực hiện thao tác cấp C trên mảng.

In [17]: x = np.zeros(10, dtype=np.object) 
In [18]: x[3] = {'pants', 10} 
In [19]: x 
Out[19]: array([0, 0, 0, set([10, 'pants']), 0, 0, 0, 0, 0, 0], dtype=object) 
+0

Xin lỗi, quên viết ... Tôi cần truy cập ngôn ngữ chéo ... (từ C/C++) –

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