2012-06-17 30 views
9

Tôi đang lưu trữ một mảng nhị phân lớn trong một tài liệu. Tôi muốn tiếp tục thêm byte vào mảng này và đôi khi thay đổi giá trị của các byte hiện có.Làm thế nào để lưu trữ và cập nhật hiệu quả dữ liệu nhị phân trong Mongodb?

Tôi đang tìm kiếm một số $ append_bytes và $ replace_bytes loại công cụ sửa đổi nhưng dường như điều tốt nhất tôi có thể làm là đẩy $ cho mảng. Có vẻ như điều này sẽ có thể thực hiện được bằng cách thực hiện các thao tác kiểu tìm kiếm-ghi nếu tôi có quyền truy cập bằng cách nào đó vào bson bên dưới trên đĩa, nhưng nó không xuất hiện với tôi rằng có anyway để làm điều này trong mongodb (và có lẽ vì lý do chính đáng).

Nếu tôi là thay vào đó chỉ cần truy vấn này mảng nhị phân, chỉnh sửa hoặc thêm vào nó, và sau đó cập nhật các tài liệu bằng cách viết lại toàn bộ lĩnh vực, làm thế nào tốn kém sẽ có được sao? Mỗi mảng nhị phân sẽ có thứ tự là 1-2MB và cập nhật diễn ra sau mỗi 5 phút và trên 1000 tài liệu. Tệ hơn nữa, nhưng không có cách nào dễ dàng để phát tán chúng ra (theo thời gian) và chúng thường sẽ xảy ra gần nhau trong khoảng thời gian 5 phút. Có ai có cảm giác tốt về thảm họa này không? Có vẻ như nó sẽ có vấn đề.

Một cách khác là lưu trữ dữ liệu nhị phân này dưới dạng tệp riêng biệt trên đĩa, triển khai nhóm luồng để thao tác hiệu quả các tệp trên đĩa và tham chiếu tên tệp từ tài liệu mongodb của tôi. (Tôi đang sử dụng python và pymongo vì vậy tôi đã nhìn vào pytables). Tôi muốn tránh điều này mặc dù nếu có thể.

Có bất kỳ thay thế khác mà tôi đang nhìn ra đây?

Cảm ơn advnace.

EDIT

Sau khi một số công việc viết một số bài kiểm tra đối với trường hợp sử dụng của tôi, tôi đã quyết định sử dụng một hệ thống tập tin riêng biệt cho các đối tượng dữ liệu nhị phân (đặc biệt hdf5 sử dụng một trong hai pytables hoặc h5py). Tôi vẫn sẽ sử dụng mongo cho tất cả mọi thứ ngoại trừ sự kiên trì của các đối tượng dữ liệu nhị phân này. Theo cách này, tôi có thể tách rời hiệu năng liên quan đến chắp thêm và cập nhật các hoạt động loại khỏi hiệu suất cơ bản của tôi. Một trong những nhà phát triển mongo đã chỉ ra rằng tôi có thể thiết lập các phần tử mảng bên trong bằng cách sử dụng ký hiệu chấm và $ set (xem ref trong chú thích dưới đây), nhưng không có cách nào tại thời điểm này để thực hiện một loạt các bộ trong một mảng nguyên tử. Hơn nữa - nếu tôi có 1.000 trường dữ liệu nhị phân 2MB trong tài liệu mongo của tôi và tôi cập nhật và phát triển chúng thường xuyên (ít nhất cứ 5 phút một lần) - ruột của tôi nói với tôi rằng mongo sẽ phải quản lý rất nhiều vấn đề phân bổ/tăng trưởng trong (các) tệp của nó trên đĩa - và cuối cùng điều này sẽ dẫn đến các vấn đề về hiệu năng. Tôi thà tải nó đến một hệ thống tập tin riêng biệt ở cấp hệ điều hành để xử lý.

Cuối cùng - Tôi sẽ được thao tác và thực hiện tính toán trên dữ liệu của tôi sử dụng NumPy - cả pytables và các module h5py cho phép tích hợp tốt đẹp giữa hành vi NumPy và các cửa hàng.

+0

Nó chỉ mang đến sự chú ý của tôi bằng một trong những nhà phát triển MongoDB mà bạn có thể truy cập vào các phần tử mảng cá nhân sử dụng $ thiết lập với ký hiệu dấu chấm. Tôi đã bỏ qua điều này. Tỉ là tại địa chỉ: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-ArrayElementbyPosition – Rocketman

Trả lời

4

Như bạn đã nói rằng, bạn thường xuyên chỉnh sửa dữ liệu nhị phân của bạn, trên thực tế rất thường xuyên. GridFS là một tùy chọn khác tôi sẽ đề xuất.

When to use GridFS có thể có ích cho bạn

+1

Tôi nhìn vào GridFS ...các tệp được đặt() vào bộ sưu tập và nó sẽ tự động phân phối theo các khối. Nó cũng xuất hiện rằng nếu tôi cần phải thay đổi một cái gì đó - sau đó tôi cần phải đặt() một lần nữa - mà tiết kiệm một bộ toàn bộ khối. Dường như nó được xây dựng để phiên bản các tệp không thay đổi thường xuyên. Vì vậy, trong trường hợp của tôi, tôi sẽ có một số lượng lớn các bản sao của tập tin. Trừ khi nó bằng cách nào đó lưu trữ thay đổi bằng cách khác bằng cách nào đó - nhưng không có tài liệu nào tôi thấy được đề xuất như vậy ... – Rocketman

+0

Vâng, thực sự cập nhật mâm cặp hiện tại sẽ là đau đầu khó chịu. Thay vào đó, nói chung bạn muốn theo mẫu này: 1.) tìm hình cũ, giữ _id 2.) thêm số mới 3.) xóa số cũ bằng _id –

+0

http://stackoverflow.com/questions/6280186/append-data-to-existing-gridfs-file, hãy xem cái này –

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