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)
두 번째 실험에서도 동일한 접근 방식을 사용했지만 데이터 세트의 데이터는 짧은 문자열로만 구성되었습니다.
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
'programing' 카테고리의 다른 글
VS 2012에서 사용자 지정 바인딩 호스트가 있는 IIS를 사용하는 프로젝트를 로드할 수 없습니다. IIS Express를 사용하고 있다고 생각합니다. (0) | 2023.06.27 |
---|---|
C에서 #pragma는 한때 무엇을 의미합니까? (0) | 2023.06.27 |
이전 노드 버전으로 다운그레이드하는 방법 (0) | 2023.05.19 |
GitHub에서 포크 간 병합 (0) | 2023.05.19 |
머큐리얼 프로젝트를 깃으로 변환 (0) | 2023.05.18 |