Tìm hiểu lượng bộ nhớ được sử dụng bởi khung dữ liệu Pandas có thể cực kỳ hữu ích khi làm việc với khung dữ liệu lớn hơn. Trong bài đăng này, chúng ta sẽ thấy hai ví dụ về ước tính mức sử dụng bộ nhớ của khung dữ liệu Pandas bằng các chức năng của Pandas. Trước tiên, chúng ta sẽ xem cách tìm tổng mức sử dụng bộ nhớ của khung dữ liệu Pandas bằng hàm Pandas info[] và sau đó chúng ta sẽ xem một ví dụ về cách tìm mức sử dụng bộ nhớ của tất cả các biến trong khung dữ liệu bằng hàm Pandas memory_usage[]
Hãy để chúng tôi tải Pandas trước và kiểm tra phiên bản của nó
import pandas as pd pd.__version__ 1.0.0
Chúng tôi sẽ sử dụng tập dữ liệu từ dự án TidyTuesday và tập dữ liệu này là về chi phí học phí đại học trên khắp Hoa Kỳ
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]
Chúng ta có thể thấy rằng khung dữ liệu của chúng ta chứa các kiểu dữ liệu khác nhau
name state state_code type degree_length 0 Aaniiih Nakoda College Montana MT Public 2 Year 1 Abilene Christian University Texas TX Private 4 Year 2 Abraham Baldwin Agricultural College Georgia GA Public 2 Year 3 Academy College Minnesota MN For Profit 2 Year 4 Academy of Art University California CA For Profit 4 Year
Tổng mức sử dụng bộ nhớ của Pandas Dataframe với thông tin []
Chúng ta có thể sử dụng hàm Pandas info[] để tìm tổng mức sử dụng bộ nhớ của một khung dữ liệu. Hàm thông tin gấu trúc [] chủ yếu được sử dụng cho thông tin về từng cột, loại dữ liệu của chúng và số lượng giá trị không phải là null cho mỗi biến. Chức năng thông tin gấu trúc [] cũng cung cấp cho chúng tôi mức sử dụng bộ nhớ ở cuối báo cáo của nó
Để có được mức sử dụng bộ nhớ đầy đủ, chúng tôi cung cấp đối số memory_usage=”deep” cho info[]
df.info[memory_usage="deep"]
Chúng tôi nhận được tất cả thông tin cơ bản về khung dữ liệu và cuối cùng, chúng tôi cũng nhận được “mức sử dụng bộ nhớ. 1. 1 MB” cho khung dữ liệu
RangeIndex: 2973 entries, 0 to 2972 Data columns [total 10 columns]: # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 2973 non-null object 1 state 2921 non-null object 2 state_code 2973 non-null object 3 type 2973 non-null object 4 degree_length 2973 non-null object 5 room_and_board 1879 non-null float64 6 in_state_tuition 2973 non-null int64 7 in_state_total 2973 non-null int64 8 out_of_state_tuition 2973 non-null int64 9 out_of_state_total 2973 non-null int64 dtypes: float64[1], int64[4], object[5] memory usage: 1.1 MB
Sử dụng bộ nhớ của từng cột trong Pandas Dataframe với memory_usage[]
Chức năng thông tin gấu trúc [] đã cung cấp tổng bộ nhớ được sử dụng bởi một khung dữ liệu. Tuy nhiên, đôi khi bạn có thể muốn bộ nhớ được sử dụng bởi từng cột trong khung dữ liệu Pandas
Chúng ta có thể nhận mức sử dụng bộ nhớ của từng cột/cấp biến bằng cách sử dụng hàm Pandas memory_usage[]
df.memory_usage[]
Chúng tôi nhận được bộ nhớ được sử dụng bởi mỗi cột/biến theo byte. Theo mặc định, memory_usage[] bỏ qua dung lượng bộ nhớ của các biến có đối tượng kiểu dữ liệu
Index 128 name 23784 state 23784 state_code 23784 type 23784 degree_length 23784 room_and_board 23784 in_state_tuition 23784 in_state_total 23784 out_of_state_tuition 23784 out_of_state_total 23784 dtype: int64
Chúng ta có thể nhận được mức sử dụng bộ nhớ không bao gồm kiểu dữ liệu đối tượng bằng cách sử dụng đối số deep=True cho hàm memory_usage[]
df.memory_usage[deep=True]
Chúng tôi nhận được các byte được sử dụng bởi mỗi biến, nhưng lần này nó cung cấp cho bộ nhớ sử dụng các kiểu dữ liệu đối tượng
________số 8Vì hàm memory_usage[] trả về một khung dữ liệu về mức sử dụng bộ nhớ, nên chúng ta có thể tính tổng để có được tổng bộ nhớ đã sử dụng
df.memory_usage[deep=True].sum[] 1112497
Chúng ta có thể thấy rằng mức sử dụng bộ nhớ được ước tính bởi Pandas info[] và memory_usage[] với tùy chọn deep=True phù hợp. Thông thường, các biến đối tượng có thể có dung lượng bộ nhớ lớn. Bằng cách chuyển đổi biến đối tượng của kiểu chuỗi thành phân loại, người ta có thể giảm dung lượng bộ nhớ
Bài đăng này là một phần của loạt bài về Pandas 101, hướng dẫn bao gồm các mẹo và thủ thuật sử dụng Pandas để thu thập và phân tích dữ liệu
Với
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]3, bạn có thể kiểm tra việc sử dụng bộ nhớ của một đối tượng. Để làm như vậy, trước tiên hãy nhập mô-đun
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]4
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]0
Woah… đợi đã… tại sao danh sách khổng lồ này chỉ có 48 byte?
Đó là bởi vì hàm phạm vi trả về một đối tượng có thể lặp lại chỉ hoạt động như một danh sách các số, nhưng bên trong chỉ đơn giản là giữ số lần lặp lại cuối cùng. Một phạm vi có cường độ bộ nhớ hiệu quả hơn so với sử dụng danh sách số thực tế
Bạn có thể tự mình xem bằng cách sử dụng khả năng hiểu danh sách để tạo danh sách Python thực tế gồm các số từ cùng một phạm vi
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]1
Đó là khoảng 87KB cho 10.000 số
Không chính xác lắm
Một điều cần lưu ý. phương pháp này không chính xác lắm.
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]5 sẽ không tính toán đệ quy mức sử dụng bộ nhớ của tất cả các đối tượng trong danh sách hoặc từ điển. Vì vậy, khi yêu cầu kích thước của danh sách, bạn chỉ yêu cầu kích thước của chính danh sách đó và tất cả các tham chiếu của nó đến nội dung, nhưng kích thước của tất cả các số nguyên đó không được tính đến. e. g. , một số nguyên Python tự chiếm 28 byte
data_url="//raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-10/tuition_cost.csv" df = pd.read_csv[data_url] df.iloc[0:5,0:5]2
10K số nguyên sẽ chiếm thêm 280K byte bộ nhớ, ngoài kích thước danh sách là 87K