Hướng dẫn do python dictionaries take up a lot of memory? - từ điển python có chiếm nhiều bộ nhớ không?

Nếu bạn đang cố gắng lưu trữ dữ liệu số nén trong Python trong bộ nhớ, giải pháp tốt nhất của bạn có lẽ là vô cùng.

Numpy [//numpy.org] phân bổ các cấu trúc dữ liệu bằng các cấu trúc C gốc. Hầu hết các cấu trúc dữ liệu của nó cho rằng bạn đang lưu trữ một kiểu dữ liệu duy nhất, vì vậy đây không phải là cho tất cả các tình huống [bạn có thể cần lưu trữ null, v.v.], nhưng nó có thể rất, rất, rất nhanh và Bạn có thể yêu cầu. Rất nhiều khoa học được thực hiện với nó [xem thêm: Scipy].

Tất nhiên, có một tùy chọn khác: ZLIB, nếu bạn có:zlib, if you have:

  • Chu kỳ CPU dồi dào, và
  • Rất nhiều dữ liệu không phù hợp với bộ nhớ

Bạn chỉ có thể khai báo một 'trang' dữ liệu [tuy nhiên bạn muốn] như một mảng, đọc trong dữ liệu, lưu trữ nó trong mảng, zip nó, sau đó đọc thêm một số dữ liệu, cho đến khi bạn có tất cả dữ liệu trong bộ nhớ bạn muốn.

Sau đó, lặp lại trên các trang, giải nén, chuyển đổi trở lại một mảng và thực hiện các hoạt động của bạn khi cần thiết. Ví dụ:

def arrayToBlob[self, inArray]:
    a = array.array['f', inArray]
    return a.tostring[]

def blobToArray[self, blob, suppressWarning=False]:
    try:
        out = array.array['f', []]
        out.fromstring[blob]
    except Exception, e:
        if not suppressWarning:
            msg = "Exception: blob2array, err: %s, in: %s" % [e, blob]
            self.log.warning[msg]
            raise Exception, msg
    return out

Khi bạn có dữ liệu dưới dạng blob, bạn có thể chuyển Blob này cho ZLIB và nén dữ liệu. Nếu bạn có rất nhiều giá trị lặp đi lặp lại, blob này có thể được nén rất nhiều.zlib and compress the data. If you have lots of repeated values, this blob can be vastly compressed.

Tất nhiên, nó chậm hơn so với việc giữ tất cả không nén, nhưng nếu bạn không thể phù hợp với nó trong bộ nhớ, các lựa chọn của bạn bị giới hạn để bắt đầu.

Ngay cả khi nén, nó có thể không phù hợp với bộ nhớ, tại thời điểm đó bạn có thể phải viết ra các trang nén dưới dạng chuỗi hoặc dưa chua, v.v.

Chúc may mắn!

Trong bài viết này, chúng ta sẽ thấy mức tiêu thụ bộ nhớ trong từ điển và một danh sách các bộ dữ liệu.

Từ điển chiếm nhiều không gian hơn một danh sách các bộ dữ liệu. Ngay cả một dict trống chiếm nhiều không gian so với một danh sách các bộ dữ liệu.

Ví dụ 1: Như chúng ta có thể thấy rõ rằng có một sự khác biệt lớn giữa mức tiêu thụ bộ nhớ của cả hai kiểu dữ liệu khi cả hai đều trống. As we can clearly see that there is a huge difference between memory consumption of both the datatypes when both are empty.

Ví dụ 2: Trong ví dụ này, do đó, 3-4 yếu tố trong Dict và Danh sách các bộ dữ liệu.In this example, therefore 3-4 elements in dict and list of tuples.

Một lần nữa chúng ta có thể so sánh mức tiêu thụ bộ nhớ là 224 byte trong Dict trong khi 112 đối với danh sách các bộ dữ liệu.

Ví dụ 3: Hãy xem xét 1-100 yếu tố trong Dict và Danh sách các bộ dữ liệu và kiểm tra kết quả là gì.Lets consider 1-100 elements in dict and list of tuples and checkout whats the result.

{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13 : 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25: , 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38 : 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50 , 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63 : 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75: 75 , 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88 : 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100: 100 }

4704

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 , 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50 , 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75 , 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 ]

1008

Đối với một số lượng lớn các yếu tố, chúng ta có thể thấy rõ rằng không có so sánh trong tiêu thụ bộ nhớ. Dict là gần 4,7 lần danh sách các bộ dữ liệu chỉ với 100 yếu tố. Nếu chúng ta có nhiều yếu tố để lưu trữ, chỉ cần nghĩ về bộ nhớ được thực hiện bởi một dict.

Chúng tôi đã xác định những thay đổi về kích thước của cả hai đối tượng sau khi bổ sung các yếu tố được đề cập dưới đây.

Không, bài viết đang so sánh một số lượng lớn từ điển nhỏ [3 mục], với một số lượng lớn các trường hợp đối tượng nhỏ [3 thuộc tính]. Python biết cách chia sẻ bộ nhớ trong trường hợp đối tượng vì các khóa từ điển [tên thuộc tính], thường có thể được chia sẻ giữa tất cả các từ điển thể hiện [PEP 412].

Nó không áp dụng cho tình huống của một từ điển lớn. Nói chung, chi phí của tất cả các bộ nhớ cho tất cả các đối tượng được lưu trữ sẽ vượt quá chi phí bộ nhớ của từ điển; Vì vậy, đừng lo lắng về điều đó, bạn có cá lớn hơn để chiên.

Chỉnh sửa: Chỉ vì niềm vui khi giải quyết các số:

>>> from sys import getsizeof
>>> getsizeof[1]
28  # So at least 28 bytes for each distinct int
>>> getsizeof[1] * 12* 10**6
336000000  # about 320 MiB of memory for 12 million unique int objects
>>> d = {x:1 for x in range[12 * 10**6]}
>>> getsizeof[d]
671088744  # So about 640 MiB for the dictionary to hold all those objects
>>> d2 = {x:[-x] for x in range[12 * 10**6]}
>>> getsizeof[d2]
671088744 # Now both keys and values are unique, and the int object memory use matches the dict storage use
>>> getsizeof[1] * 2 * 12* 10**6
672000000  # memory used for 24 million unique int objects
>>> l = list[range[2 * 12 * 10**6]]
>>> getsizeof[l]
216000112  # a list of those 24 million objects is about a third the memory as a dict [makes sense, the dict also has to store the hash of each key]

Vì vậy, ngay cả với một số đối tượng nhỏ nhất trong Python, bộ nhớ được sử dụng bởi chính các đối tượng là cùng thứ tự như từ điển giữ nó. Nếu các khóa là chuỗi và các giá trị là các đối tượng phức tạp hơn INT, bộ nhớ được sử dụng bởi các đối tượng được giữ sẽ có khả năng chiếm ưu thế.

Python có tiêu thụ nhiều bộ nhớ không?

Những con số đó có thể dễ dàng phù hợp với số nguyên 64 bit, vì vậy người ta sẽ hy vọng Python sẽ lưu trữ hàng triệu số nguyên đó không quá ~ 8MB: một triệu đối tượng 8 byte.Trên thực tế, Python sử dụng nhiều RAM hơn 35 MB để lưu trữ các số này.Tại sao?Bởi vì số nguyên python là đối tượng và các đối tượng có nhiều bộ nhớ trên đầu.objects have a lot of memory overhead.

Từ điển sử dụng bao nhiêu bộ nhớ?

Điều đó có nghĩa là bạn cần khoảng 1 MB bộ nhớ để lưu trữ toàn bộ từ điển.Tất nhiên bạn có thể xì hơi nó [zip] và lưu trữ trong bộ nhớ, với tỷ lệ nén khoảng 90%.Điều đó có nghĩa là 100 kb.1 MB of memory to store the entire dictionary. Of course you can deflate it [zip] and store in memory, with a compression rate of about 90%. That means 100 KB.

Từ điển có sử dụng ít bộ nhớ hơn danh sách không?

Mặc dù từ điển được tối ưu hóa nhiều hơn trong Python 3.6, nhưng chúng vẫn sử dụng nhiều bộ nhớ hơn danh sách, vì bạn cũng cần sử dụng không gian cho các phím và tra cứu, trong khi danh sách chỉ sử dụng không gian cho các giá trị.they still use more memory than lists, since you need to use space for the keys and the lookup as well, while lists use space only for the values.

Từ điển có chiếm nhiều không gian hơn danh sách không?

Từ điển chiếm nhiều không gian hơn một danh sách các bộ dữ liệu.Ngay cả một dict trống chiếm nhiều không gian so với một danh sách các bộ dữ liệu.. Even an empty dict occupies much space as compared to a list of tuples.

Bài Viết Liên Quan

Chủ Đề