programing

Pandas의 데이터 프레임에 필요한 메모리 양을 어떻게 추정합니까?

cafebook 2023. 6. 27. 23:37
반응형

Pandas의 데이터 프레임에 필요한 메모리 양을 어떻게 추정합니까?

전 계속 궁금했어요...예를 들어, 400MB의 csv 파일을 panda 데이터 프레임으로 읽는 경우(read_csv 또는 read_table 사용), 이 파일에 필요한 메모리 용량을 추정할 수 있는 방법이 있습니까?데이터 프레임과 메모리를 더 잘 이해하려고 노력하는 중입니다.

df.memory_usage() 각 열이 차지하는 바이트 수를 반환합니다.

>>> df.memory_usage()

Row_ID            20906600
Household_ID      20906600
Vehicle           20906600
Calendar_Year     20906600
Model_Year        20906600
...

인스를포면려함하, 전달덱을 전달합니다.index=True.

전체 메모리 사용량을 확인하려면 다음을 수행합니다.

>>> df.memory_usage(index=True).sum()
731731000

, 한또, 격합을 하는 것deep=True포함된 개체의 전체 사용량을 설명하는 보다 정확한 메모리 사용량 보고서를 사용할 수 있습니다.

사용량에는 요소가 되지 않기 입니다.deep=False(기본 대소문자).

여기 여러 가지 방법을 비교해 보겠습니다.sys.getsizeof(df)가장 간단합니다.

예에서는, 이예서는에,는,df행, 열(2의 객체)이 프레임입니다. - 427kb 모양 파일 814 , 11 의열행(2 int, 9 의객) - 427kb .

sys.getsize of(df)

>> sys 가져오기>> sys.getsize of (df)
(결과를 바이트 단위로 표시)462456

df.memory_dll 파일

>> df.memory_df.memory....(각 열을 8바이트/행으로 나열)
>> df.memory_().()sumusage71712(행 수 * 콜 수 * 8바이트)
>> df.memory_usage (deep=True)(각 열의 전체 메모리 사용량 나열)
>> df.memory_usage(deep=True).sum()(결과를 바이트 단위로 표시)462432

df.info 웹사이트

데이터 프레임 정보를 stdout으로 인쇄합니다.기술적으로 이것들은 킬로바이트가 아니라 키비바이트(KiB)입니다. 문서 문자열에 따르면 "메모리 사용량은 사람이 읽을 수 있는 단위(베이스-2 표현)로 표시됩니다."따라서 바이트를 가져오려면 예를 들어 451.6KiB = 462,438바이트가 1024배 증가합니다.

>> df.info 웹사이트...메모리 사용량: 70.0KB 이상
>> df.info (memory_memory='deep')...메모리 사용량: 451.6KB

저는 제가 토론에 자료를 좀 더 가지고 와야겠다고 생각했습니다.

저는 이 문제에 대해 일련의 테스트를 수행했습니다.

파이썬을 사용하여resource패키지 내 프로세스의 메모리 사용량을 받았습니다.

를 csv로 .StringIO버퍼 크기를 바이트 단위로 쉽게 측정할 수 있었습니다.

저는 두 가지 실험을 했습니다. 각각의 실험은 10,000줄에서 1,000,000줄 사이의 크기가 증가하는 20개의 데이터 프레임을 만들었습니다.둘 다 열이 10개입니다.

첫 번째 실험에서는 데이터 세트에서 부동액만 사용했습니다.

이것은 줄 수의 함수로서 csv 파일과 비교하여 메모리가 증가한 방법입니다.(사이즈(MB)

Memory and CSV size in Megabytes as a function of the number of rows with float entries

두 번째 실험에서도 동일한 접근 방식을 사용했지만 데이터 세트의 데이터는 짧은 문자열로만 구성되었습니다.

Memory and CSV size in Megabytes as a function of the number of rows with string entries

CSV의 크기와 데이터 프레임의 크기의 관계는 상당히 다를 수 있지만 메모리의 크기는 항상 2-3배 더 커집니다(이 실험의 프레임 크기의 경우).

저는 더 많은 실험으로 이 답변을 완성하고 싶습니다, 제가 특별한 것을 시도하기를 원한다면 의견을 말해주세요.

반대로 해야 돼요.

In [4]: DataFrame(randn(1000000,20)).to_csv('test.csv')

In [5]: !ls -ltr test.csv
-rw-rw-r-- 1 users 399508276 Aug  6 16:55 test.csv

기술적으로 메모리는 이와 관련이 있습니다(인덱스 포함).

In [16]: df.values.nbytes + df.index.nbytes + df.columns.nbytes
Out[16]: 168000160

400MB 파일과 함께 168MB 메모리, 20개의 부동 열로 구성된 1M 행

DataFrame(randn(1000000,20)).to_hdf('test.h5','df')

!ls -ltr test.h5
-rw-rw-r-- 1 users 168073944 Aug  6 16:57 test.h5

이진 HDF5 파일로 작성하면 훨씬 더 컴팩트합니다.

In [12]: DataFrame(randn(1000000,20)).to_hdf('test.h5','df',complevel=9,complib='blosc')

In [13]: !ls -ltr test.h5
-rw-rw-r-- 1 users 154727012 Aug  6 16:58 test.h5

데이터가 랜덤했기 때문에 압축은 크게 도움이 되지 않습니다.

네, 있다니. Panda는 2차원 numpy로 저장할 것입니다.ndarray구조를 d 유형별로 그룹화합니다. ndarray기본적으로 작은 헤더가 있는 원시 C 데이터 배열입니다.그래서 당신은 그것의 크기를 곱하는 것만으로 그것의 크기를 추정할 수 있습니다.dtype배열의 치수와 함께 포함됩니다.

를 들어, 2 ": 2 " 1000 " "인 np.int32그리고 5np.float64의 2x1000 열, 데이하 2x1000 나가 있습니다.np.int32및 x 1x1 0x1 0x1 0x1 0.np.float64 열배, 즉:

4바이트*2*1000 + 8바이트*5*1000 = 48000바이트

만약 당신이 그것을 안다면.dtype어레이의 s를 사용하면 데이터를 저장하는 데 필요한 바이트 수 + Python 개체 자체의 일부를 직접 계산할 수 있습니다.numpy가 배은입니다.nbytes의 배열에서 바이트 수를 얻을 수 .DataFrame 함으로써

nbytes = sum(block.values.nbytes for block in df.blocks.values())

object에 대한 포인터 )PyObject), 해야 합니다. , " "CSV"와 "Csv"를 참조하십시오.read_csv그것들을 로 바꿀 것입니다.object배열을 입력하고 그에 따라 계산을 조정합니다.

편집:

자세한 내용은 스칼라 유형 페이지를 참조하십시오.object dtype참조만 저장되므로 배열에 포함된 개체의 크기도 고려해야 합니다.알 수 , 은 Python 이 과 페이알수있객체어듯레다유 Python 니사합소다는이서에지이와 다소 유사합니다.list물건들.

이것은 메모리 내 크기에 파이썬의 모든 객체를 제공한다고 생각합니다.판다와 numpy와 관련하여 내부 확인이 필요합니다.

>>> import sys
#assuming the dataframe to be df 
>>> sys.getsizeof(df) 
59542497

사람이 읽을 수 있는 결과를 인쇄하려면 다음을 시도할 수 있습니다.

suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def humansize(nbytes):
    i = 0
    while nbytes >= 1024 and i < len(suffixes)-1:
        nbytes /= 1024.
        i += 1
    f = ('%.2f' % nbytes).rstrip('0').rstrip('.')
    return '%s %s' % (f, suffixes[i])

df.memory_usage(index=True, deep=True).apply(humansize)
# Index  128 B
# a      571.72 MB
# b      687.78 MB
# c      521.6 MB
# dtype: object

humansize(df.memory_usage(index=True, deep=True).sum())
# 1.74 GB

답변과 이 답변에서 수정된 코드입니다.

언급URL : https://stackoverflow.com/questions/18089667/how-to-estimate-how-much-memory-a-pandas-dataframe-will-need

반응형