2009-02-10 32 views
7

Tất cả những gì tôi muốn làm là serialize và unserialize tuples của strings hoặc ints.Pickle nhẹ cho các loại cơ bản trong python?

Tôi đã xem pickle.dumps() nhưng chi phí byte là đáng kể. Về cơ bản có vẻ như nó chiếm khoảng 4x không gian nhiều như nó cần. Bên cạnh đó, tất cả những gì tôi cần là các kiểu cơ bản và không cần serialize các đối tượng.

nguyên soái tốt hơn một chút về mặt không gian nhưng kết quả chứa đầy \ x00 byte khó chịu. Lý tưởng nhất là tôi muốn kết quả là con người có thể đọc được.

Tôi nghĩ chỉ sử dụng repr() và eval(), nhưng có cách đơn giản để tôi có thể thực hiện điều này mà không cần sử dụng eval() không?

Điều này đang được lưu trữ trong một db chứ không phải tệp. Byte overhead quan trọng bởi vì nó có thể tạo ra sự khác biệt giữa việc yêu cầu cột TEXT so với một varchar, và độ dữ liệu nói chung ảnh hưởng đến tất cả các vùng của hiệu năng db.

+0

chi phí * là * quan trọng đối với bãi chứa dưa muối! –

+2

Biểu đồ Bristol Stool là một tài nguyên tuyệt vời để xác định loại byte \ x00 khó chịu nào mà bạn có thể gặp phải http://en.wikipedia.org/wiki/File:Bristol_Stool_Chart.png –

+0

trong đó có vấn đề với configparser? –

Trả lời

13

Hãy xem json, ít nhất là dumps được tạo với nhiều ngôn ngữ khác.

JSON (Ký hiệu đối tượng JavaScript) http://json.org là tập hợp con cú pháp JavaScript (ECMA-262 3rd edition) được sử dụng làm định dạng trao đổi dữ liệu nhẹ.

1

Có một số nội dung kiên trì được đề cập trong số python documentation nhưng tôi không nghĩ rằng bất kỳ nội dung nào trong số này nhỏ hơn đáng kể trong tệp được tạo ra.

Bạn có thể sử dụng số configparser nhưng ở đó bạn chỉ nhận được chuỗi, int, float, bool.

0

"chi phí byte là đáng kể"

Tại sao điều này lại quan trọng? Nó thực hiện công việc. Nếu bạn sắp hết dung lượng đĩa, tôi rất vui khi bán cho bạn 1Tb với giá 500 đô la.

Bạn đã chạy chưa? Hiệu suất có phải là vấn đề không? Bạn có thể chứng minh rằng hiệu suất của tuần tự hóa là sự cố?

"Tôi nghĩ chỉ sử dụng repr() và eval(), nhưng có cách đơn giản để tôi có thể thực hiện việc này mà không cần sử dụng eval() không?"

Không có gì đơn giản hơn repr và eval.

Có gì sai với eval?

Có phải là "ai đó có thể chèn mã độc hại vào tệp mà tôi đã sắp xếp các danh sách của tôi" không?

Ai - cụ thể - sẽ tìm và chỉnh sửa tệp này để đưa vào mã độc hại? Bất cứ điều gì bạn làm để bảo đảm điều này (tức là, mã hóa) sẽ loại bỏ "đơn giản" khỏi nó.

+0

Vấn đề với eval là: bạn cần tự mình xử lý lỗi (ví dụ: lỗi chính tả). –

+0

Bạn đang mong đợi những lỗi nào? Bạn sản xuất nó với repr. Điều gì có thể xảy ra? –

+0

Tại sao điều này quan trọng ?: nó có thể tạo sự khác biệt giữa việc có thể lưu trữ nó trong một varchar hoặc một cột văn bản Ai - cụ thể - sẽ tìm và chỉnh sửa tệp này để đưa vào mã độc ?: đặc quyền tiêu chuẩn lỗ hổng leo thang. –

8

cá nhân tôi sẽ sử dụng yaml. nó ngang bằng với json cho kích thước mã hóa, nhưng nó có thể đại diện cho một số thứ phức tạp hơn (ví dụ: các lớp, cấu trúc đệ quy) khi cần thiết.

In [1]: import yaml 
In [2]: x = [1, 2, 3, 'pants'] 
In [3]: print(yaml.dump(x)) 
[1, 2, 3, pants] 

In [4]: y = yaml.load('[1, 2, 3, pants]') 
In [5]: y 
Out[5]: [1, 2, 3, 'pants'] 
8

Có lẽ bạn không sử dụng giao thức đúng:

>>> import pickle 
>>> a = range(1, 100) 
>>> len(pickle.dumps(a)) 
492 
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL)) 
206 

Xem tài liệu cho pickle data formats.

-1

May mắn là có giải pháp sử dụng COMPRESSION và giải quyết vấn đề chung liên quan đến bất kỳ đối tượng Python tùy ý bao gồm các lớp mới. Thay vì quản lý vi mô chỉ bộ đôi khi tốt hơn nên sử dụng công cụ DRY.
Mã của bạn sẽ được tái cấu trúc rõ ràng và dễ dàng hơn trong các tình huống tương tự trong tương lai.

y_serial.py đối tượng Python mô-đun :: kho với SQLite

"serialization + kiên trì :: trong một vài dòng mã, nén và chú thích Python đối tượng vào SQLite; sau đó lấy chúng thứ tự thời gian theo từ khóa mà không cần bất kỳ SQL Mô-đun "tiêu chuẩn" hữu ích nhất cho cơ sở dữ liệu để lưu trữ dữ liệu lược đồ ít hơn. "

http://yserial.sourceforge.net

[Nếu bạn vẫn đang lo ngại, tại sao không dính vào những bản ghi trong một cuốn từ điển, sau đó áp dụng y_serial vào từ điển. Có lẽ bất kỳ chi phí sẽ biến mất do sự nén trong suốt trong nền bằng zlib.]

Như để dễ đọc, tài liệu cũng cung cấp cho các chi tiết trên tại sao cPickle đã được chọn qua json.

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