2013-08-06 16 views
10

Tôi đã đọc ở đâu đó để bạn có thể lưu trữ các đối tượng python (cụ thể hơn từ điển) dưới dạng nhị phân trong MongoDB bằng BSON. Tuy nhiên ngay bây giờ tôi không thể tìm thấy bất kỳ tài liệu nào liên quan đến điều này.Có cách nào để lưu trữ các đối tượng python trực tiếp trong mongoDB mà không cần tuần tự hóa chúng

Có ai biết chính xác điều này có thể được thực hiện không?

+1

Không rõ ràng bạn đang cố gắng làm gì, những gì bạn đã thử và những gì không hiệu quả. Vui lòng chỉnh sửa câu hỏi để bao gồm các chi tiết hữu ích đó. :) – WiredPrairie

+2

Nếu bạn làm điều đó cho hiệu suất, [điểm chuẩn này] (http://kovshenin.com/2010/pickle-vs-json-which-is-faster/) có thể làm bạn ngạc nhiên. – georg

+0

@ thg435: Cảm ơn bạn đã liên kết, tôi sẽ ghi nhớ một dự án mà I/O sẽ quan trọng hơn cho việc thực hiện dự án của tôi! – chiffa

Trả lời

23

Không có cách nào để lưu trữ một đối tượng trong một tệp (cơ sở dữ liệu) mà không cần tuần tự hóa nó. Nếu dữ liệu cần di chuyển từ một tiến trình này sang tiến trình khác hoặc đến một máy chủ khác, nó sẽ cần phải được tuần tự hóa ở một dạng nào đó để truyền đi. Vì bạn đang hỏi về MongoDB, dữ liệu sẽ được tuần tự hóa hoàn toàn dưới dạng nào đó để được lưu trữ trong cơ sở dữ liệu MongoDB. Khi sử dụng MongoDB, nó là BSON.

Nếu bạn đang thực sự hỏi liệu có cách nào để lưu trữ một dạng thô của đối tượng Python trong tài liệu MongoDB hay không, bạn có thể chèn trường Binary vào tài liệu có thể chứa bất kỳ dữ liệu nào bạn muốn . Nó không thể truy vấn trực tiếp dưới bất kỳ hình thức nào, do đó bạn có thể mất rất nhiều lợi ích khi sử dụng cơ sở dữ liệu tài liệu NoSQL như MongoDB.

>>> from pymongo import MongoClient 
>>> client = MongoClient('localhost', 27017) 
>>> db = client['test-database'] 
>>> coll = db.test_collection  
>>> # the collection is ready now 
>>> from bson.binary import Binary 
>>> import pickle 
>>> # create a sample object 
>>> myObj = {} 
>>> myObj['demo'] = 'Some demo data' 
>>> # convert it to the raw bytes 
>>> thebytes = pickle.dumps(myObj) 
>>> coll.insert({'bin-data': Binary(thebytes)}) 
+0

Cảm ơn câu trả lời mở rộng! Sau khi tất cả tôi nghĩ rằng tôi sẽ dính với serialization 'pickle', để xây dựng một đối tượng JSON. Nó xuất ra chuỗi giống hệt nhau cho các bộ chứa các chuỗi giống nhau, điều này rất quan trọng đối với tôi. ngoài ra, I/O của tôi vào cơ sở dữ liệu không phải là phần quan trọng nhất trong hoạt động của mã của tôi. – chiffa

+1

Có một lỗi đánh máy trong mã ví dụ: nó nên đọc pickle.dumps (myObj) trên dòng trước-the-last – Christophe

+1

Cảm ơn, pickle.dumps (obj) đã làm việc cho tôi (http://scikit-learn.org/ ổn định/modules/model_persistence.html # persistence-example) – Spl2nky

4

Giả sử bạn không đặc biệt quan tâm đến mongoDB, có thể bạn không tìm kiếm BSON. BSON chỉ là một định dạng tuần tự hóa khác so với JSON, được thiết kế cho hiệu suất không gian và tốc độ cao hơn. Mặt khác, pickle thực hiện thêm mã hóa trực tiếp các đối tượng python.

Tuy nhiên, thực hiện kiểm tra tốc độ trước khi bạn áp dụng pickle để đảm bảo nó tốt hơn cho trường hợp sử dụng của bạn.

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