반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 웹개발
- 데이터베이스
- 데이터분석
- 컴퓨터공학
- 자료구조
- 버전관리
- 2
- 빅데이터
- 파이썬
- 알고리즘
- 프로그래밍
- 네트워크
- 코딩
- 컴퓨터비전
- 프로그래밍언어
- 데이터과학
- 클라우드컴퓨팅
- 보안
- 컴퓨터과학
- 네트워크보안
- 인공지능
- 자바스크립트
- 머신러닝
- 데이터구조
- I'm Sorry
- 소프트웨어공학
- 사이버보안
- 딥러닝
- Yes
- 소프트웨어
Archives
- Today
- Total
스택큐힙리스트
대용량의 레코드가 포함된 DataFrame을 Python Pandas를 사용하여 어떻게 처리할까요? 본문
반응형
저는 약 800만 개의 레코드가 포함된 csv 파일을 가지고 있지만, 이 과정을 완료하는 데 한 시간 이상이 걸립니다. 그래서 이에 대해 도움을 요청드리고자 합니다.
참고: 파이썬 코드에 문제는 없습니다. 오류 없이 매우 잘 작동합니다. 유일한 문제는 800만 개의 레코드를 로드하고 처리하는 데 너무 많은 시간이 걸린다는 것입니다.
다음은 코드입니다.
import pandas as pd
import numpy as np
import ipaddress
from pathlib import Path
import shutil
import os
from time import time
start = time()
inc_path = 'C:/Users/phani/OneDrive/Desktop/pandas/inc'
arc_path = 'C:/Users/phani/OneDrive/Desktop/pandas/arc'
dropZone_path = 'C:/Users/phani/OneDrive/Desktop/pandas/dropZone'
for src_file in Path(dropZone_path).glob('XYZ*.csv*'):
process_file = shutil.copy(os.path.join(dropZone_path, src_file), arc_path)
for sem_file in Path(dropZone_path).glob('XYZ*.sem'):
semaphore_file = shutil.copy(os.path.join(dropZone_path, sem_file), inc_path)
# 원본 파일 이름 바꾸기
for file in os.listdir(dropZone_path):
file_path = os.path.join(dropZone_path, file)
shutil.copy(file_path, os.path.join(arc_path, Original_ + file))
for sema_file in
Path(arc_path).glob('Original_XYZ*.sem*'):
os.remove(sema_file)
## TEMP 폴더에서 CSV 파일 읽기
df = pd.read_csv(process_file)
df.sort_values([START_IP_ADDRESS], ascending=True,)
i = 0
while i < len(df) - 1:
i += 1
line = df.iloc[i:i + 1].copy(deep=True)
curr_START_IP_NUMBER = line.START_IP_NUMBER.values[0]
curr_END_IP_NUMBER = line.END_IP_NUMBER
prev_START_IP_NUMBER = df.loc[i - 1, 'START_IP_NUMBER']
prev_END_IP_NUMBER = df.loc[i - 1, 'END_IP_NUMBER']
# 간격이 없다면 계속하기
if curr_START_IP_NUMBER == (prev_END_IP_NUMBER + 1):
continue
# 간격이 있다면 간격 채우기
# 새로운 라인의 시작 IP 번호
line.START_IP_NUMBER = prev_END_IP_NUMBER + 1
line.START_IP_ADDRESS = (ipaddress.ip_address(int(line.START_IP_NUMBER)))
# 새로운 라인의 끝 IP 번호
line.END_IP_NUMBER = curr_START_IP_NUMBER - 1
line.END_IP_ADDRESS = (ipaddress.ip_address(int(line.END_IP_NUMBER)))
line.COUNTRY_CODE = ''
line.LATITUDE_COORDINATE = ''
line.LONGITUDE_COORDINATE = ''
line.ISP_NAME = ''
line.AREA_CODE = ''
line.CITY_NAME = ''
line.METRO_CODE = ''
line.ORGANIZATION_NAME = ''
line.ZIP_CODE = ''
line.REGION_CODE = ''
# 현재 인덱스와 이전 인덱스 사이에 라인 삽입
df = pd.concat([df.iloc[:i], line, df.iloc[i:]]).reset_index(drop=True)
df.to_csv(process_file, index=False)
for process_file in Path(arc_path).glob('XYZ*.csv*'):
EREFile_CSV = shutil.copy(os.path.join(arc_path, process_file), inc_path)
답변 1
팬더스 라이브러리를 사용하여 청크 단위로 .csv
파일을 읽고 각 청크를 별도로 처리하거나, 충분한 RAM을 가지고 있다면 모든 청크를 하나의 데이터 프레임에 결합할 수 있습니다:
# 1백만 행씩 청크로 데이터 읽기
chunks = pd.read_csv(process_file, chunksize=1000000)
# 각 청크 처리
for chunk in chunks:
# 청크 처리
print(len(chunk))
# 또는 청크를 단일 데이터 프레임에 결합
# pd_df = pd.concat(chunks)
또는 데이터프레임을 내부적으로 청크로 나누어 병렬로 처리하는 Dask
라이브러리를 사용할 수도 있습니다. 이는 대용량 데이터셋을 처리할 수 있습니다:
from dask import dataframe as dd
dask_df = dd.read_csv(process_file)
답변 2
판다스(Pandas)는 파이썬의 데이터 분석 도구 중 가장 인기 있고 강력한 도구입니다. 하지만 수백만 개의 레코드를 포함한 대규모 데이터프레임을 처리하는 것은 도전이 될 수 있습니다. 이 글에서는 수많은 레코드를 포함한 데이터프레임을 처리하는 방법에 대해 알아보겠습니다.1. 메모리 관리: 대규모 데이터프레임을 처리할 때 가장 중요한 요소는 메모리입니다. 메모리가 부족하면 코드 실행이 느려지거나 오류가 발생할 수 있습니다. 메모리 사용을 최적화하기 위해 다음 팁을 따르세요.
- 최소한의 필요한 열만 선택하여 데이터프레임을 로딩하십시오.
- 필요 없는 열은 삭제하거나, 메모리 사용을 줄이기 위해 데이터 형식을 최적화하세요.
- 정수 데이터를 object 형식보다 int 또는 uint 형식으로 변환하세요.
- 실수 데이터를 object나 float보다 float32로 변환하여 메모리 사용을 줄이세요.
- 카테고리형 데이터를 활용하여 메모리 사용을 줄일 수 있습니다.
2. 병렬 처리: 판다스는 기본적으로 단일 스레드로 작동합니다. 하지만 병렬 처리를 통해 작업 속도를 크게 향상시킬 수 있습니다.
- 판다스가 제공하는 `multiprocessing` 라이브러리를 이용하여 작업을 병렬로 수행하세요.
- `dask`나 `modin`과 같은 병렬 처리 라이브러리를 사용하여 병렬 작업을 간편하게 처리하세요.
3. 데이터 처리 최적화: 판다스에서 데이터 처리 속도를 향상시키기 위해 다음 팁을 활용할 수 있습니다.
- 벡터화 연산을 사용하세요. 판다스의 벡터화된 연산은 반복문을 사용하는 것보다 훨씬 빠릅니다.
- 필요한 경우 `apply()` 함수를 사용하여 사용자 정의 함수를 적용할 수 있습니다.
- 데이터프레임을 인덱싱하여 필요한 행 또는 열만 추출하세요.
- `groupby()`, `agg()` 등을 이용하여 그룹화 및 집계 작업을 최적화하세요.
4. 디스크 기반 처리: 메모리에 모든 데이터를 로딩하는 대신 디스크를 활용하여 데이터를 처리할 수 있습니다.
- `read_csv()` 함수의 `chunksize` 옵션을 설정하여 데이터를 청크 단위로 읽어들이세요.
- 각 청크를 처리하고 결과를 병합하는 방식으로 데이터를 처리하세요.
- `feather` 혹은 `parquet`와 같은 파일 형식을 활용하여 디스크 기반의 데이터 프레임을 사용하세요.
판다스를 사용하여 수백만 개의 레코드를 처리하는 것은 가능합니다. 메모리 관리, 병렬 처리, 데이터 최적화, 디스크 기반 처리를 통해 성능을 향상시킬 수 있습니다. 이러한 팁을 활용하여 대규모 데이터프레임을 효율적으로 처리하세요.
반응형
Comments