Các trường hợp sử dụng phổ biến cho dưa chua trong Python


134

Tôi đã xem tài liệu về dưa chua , nhưng tôi không hiểu dưa muối ở đâu hữu ích.

Một số trường hợp sử dụng phổ biến cho dưa chua là gì?


2
Phần tôi không nhận được về dưa chua là tại sao bạn không lưu giá trị vào một tệp? Tại sao lại ngâm nó?
whackamadoodle3000

Câu trả lời:


59

Một số cách sử dụng mà tôi đã bắt gặp:

1) lưu dữ liệu trạng thái của chương trình vào đĩa để nó có thể tiếp tục ở nơi nó bị tắt khi khởi động lại (kiên trì)

2) gửi dữ liệu python qua kết nối TCP trong hệ thống đa lõi hoặc phân tán (sắp xếp theo thứ tự)

3) lưu trữ các đối tượng python trong cơ sở dữ liệu

4) chuyển đổi một đối tượng python tùy ý thành một chuỗi để nó có thể được sử dụng làm khóa từ điển (ví dụ: để lưu vào bộ nhớ cache & ghi nhớ).

Có một số vấn đề với cái cuối cùng - hai đối tượng giống hệt nhau có thể được chọn và dẫn đến các chuỗi khác nhau - hoặc thậm chí cùng một đối tượng được ngâm hai lần có thể có các cách biểu diễn khác nhau. Điều này là do dưa chua có thể bao gồm thông tin đếm tham chiếu.

Để nhấn mạnh nhận xét của @ lunaryorn - bạn không bao giờ nên tháo chuỗi từ một nguồn không đáng tin cậy, vì một dưa chua được làm cẩn thận có thể thực thi mã tùy ý trên hệ thống của bạn. Ví dụ: xem https://blog.nelhage.com/2011/03/Exloiting-pickle/


27
Người ta không nên chuyển các đối tượng được ngâm qua mạng hoặc các kênh không tin cậy khác, trừ khi dữ liệu được chọn được bảo mật cẩn thận chống lại thao tác. Tài liệu về dưa chua cảnh báo rõ ràng không bao giờ tháo dữ liệu từ các nguồn không đáng tin cậy hoặc không được xác thực.
lunaryorn

4
@lunaryorn: điểm tốt. Nếu bạn định chuyển dữ liệu ngâm giữa các máy thì hãy sử dụng kênh bảo mật như đường hầm SSL hoặc SSH.
Dave Kirby

3
Sau đó, bạn vẫn tin tưởng điểm cuối không khai thác bạn, điều này có thể hoặc không ổn, tùy thuộc vào ngữ cảnh.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - Điểm tốt nhưng trong trường hợp đó làm thế nào chúng ta có thể mã hóa dữ liệu trong phạm vi công cộng. chúng ta có phải sử dụng một số py lib khác hay không để sử dụng dưa chua
Pardeep Sharma

Điểm 4) có đúng không? Tôi tìm thấy cái này có một số bằng chứng (cũ) sẽ không hoạt động ở đây .
salotz

10

Ví dụ khứ hồi tối thiểu ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Chỉnh sửa: nhưng đối với câu hỏi về các ví dụ về dưa chua trong thế giới thực, có lẽ cách sử dụng dưa chua tiên tiến nhất (bạn phải đào sâu vào nguồn) là ZODB: http://svn.zope.org/

Mặt khác, PyPI có đề cập đến một số: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Cá nhân tôi đã thấy một số ví dụ về các đối tượng ngâm được gửi qua mạng như một giao thức truyền mạng dễ sử dụng.


8

Pickling là hoàn toàn cần thiết cho tính toán phân tán và song song.

Giả sử bạn muốn thực hiện giảm bản đồ song song với multiprocessing(hoặc trên các nút cụm với pyina ), thì bạn cần đảm bảo chức năng bạn muốn ánh xạ qua các tài nguyên song song sẽ được xử lý. Nếu nó không được chọn, bạn không thể gửi nó đến các tài nguyên khác trên một quy trình khác, máy tính, v.v. Cũng xem ở đây để xem một ví dụ tốt.

Để làm điều này, tôi sử dụng thì là , có thể tuần tự hóa hầu hết mọi thứ trong python. Dill cũng có một số công cụ tốt để giúp bạn hiểu điều gì đang khiến cho việc tẩy rửa của bạn thất bại khi mã của bạn bị lỗi.

Và, vâng, mọi người sử dụng tính năng chọn để lưu trạng thái của phép tính hoặc phiên ipython của bạn hoặc bất cứ điều gì.


7

Tôi đã sử dụng nó trong một trong những dự án của tôi. Nếu ứng dụng bị chấm dứt trong khi nó hoạt động (nó đã thực hiện một nhiệm vụ dài và xử lý nhiều dữ liệu), tôi cần lưu toàn bộ cấu trúc dữ liệu và tải lại sau khi ứng dụng được chạy lại. Tôi đã sử dụng cPickle cho việc này, vì tốc độ là một điều rất quan trọng và kích thước của dữ liệu thực sự lớn.


4

Pickle giống như "Save As .." và "Open .." cho các cấu trúc dữ liệu và các lớp của bạn. Giả sử tôi muốn lưu cấu trúc dữ liệu của mình sao cho liên tục giữa các lần chạy chương trình.

Tiết kiệm:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

Đang tải:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

Bây giờ tôi không phải xây dựng myStuff từ đầu nữa và tôi chỉ có thể chọn (le) từ nơi tôi rời đi.


3

Đối với người mới bắt đầu (như trường hợp của tôi) thật khó hiểu tại sao sử dụng dưa chua ở nơi đầu tiên khi đọc tài liệu chính thức . Có thể bởi vì các tài liệu ngụ ý rằng bạn đã biết toàn bộ mục đích của tuần tự hóa. Chỉ sau khi đọc mô tả chung về tuần tự hóa, tôi mới hiểu lý do của mô-đun này và các trường hợp sử dụng phổ biến của nó. Ngoài ra các giải thích rộng rãi về tuần tự hóa bỏ qua một ngôn ngữ lập trình cụ thể có thể giúp ích: https://stackoverflow.com/a/14482962/4383472 , Tuần tự hóa là gì? , https://stackoverflow.com/a/3984483/4383472


"câu trả lời" của bạn không phải là một câu trả lời, nó là một nhận xét nhiều hơn. Câu hỏi của OP là "một số trường hợp sử dụng phổ biến cho dưa chua là gì?". Bạn có cảm thấy bạn đã trả lời câu hỏi đó bằng mọi cách?
Mike McKerns 10/03/2015

3
tốt, tôi cảm thấy rằng tôi đã trả lời câu hỏi bởi vì tôi cũng gặp khó khăn để hiểu cách sử dụng phổ biến của dưa chua khi tôi cố gắng đọc về mô-đun này ở đây , đâyđây . Bởi vì chủ yếu họ bắt đầu giải thích những gì dưa chua giả định rằng bạn biết động lực đằng sau toàn bộ khái niệm nối tiếp. Sau khi tôi đọc bài viết wiki đơn giản về tuần tự hóa, tôi đã nắm được ý tưởng chung cũng như "các trường hợp phổ biến". Có lẽ nó sẽ giúp được ai đó ...
Bad

và một vài trong số những trường hợp phổ biến đó là những gì? Nếu có một số câu không được liệt kê ở đây trong các câu trả lời khác thì thêm chúng vào câu trả lời của bạn sẽ rất phù hợp.
Mike McKerns

2

Để thêm một ví dụ trong thế giới thực: Công cụ tài liệu Sphinx cho Python sử dụng pickle để lưu trữ các tài liệu được phân tích cú pháp và tham chiếu chéo giữa các tài liệu, để tăng tốc các bản dựng tài liệu tiếp theo.


1

Tôi có thể cho bạn biết những công dụng tôi sử dụng và đã thấy nó được sử dụng cho:

  • Hồ sơ trò chơi tiết kiệm
  • Dữ liệu trò chơi tiết kiệm như cuộc sống và sức khỏe
  • Các bản ghi trước đây của các số nói được nhập vào một chương trình

Đó là những cái tôi sử dụng ít nhất


1

Tôi sử dụng tẩy trong quá trình web loại bỏ một trang web tại thời điểm đó tôi muốn lưu trữ hơn 8000k url và muốn xử lý chúng nhanh nhất có thể vì vậy tôi sử dụng tẩy rửa vì chất lượng đầu ra của nó rất cao.

bạn có thể dễ dàng tiếp cận với url và nơi bạn dừng ngay cả từ khóa thư mục công việc cũng lấy chi tiết url rất nhanh để tiếp tục quá trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.