[pandas] pandas 비동기적 처리 방법(async, await)

최승언·2024년 11월 22일
0

pandas

목록 보기
2/3
post-thumbnail

판다스 자체는 비동기적으로 설계되지 않았지만, 데이터를 비동기적으로 처리하거나 병렬 처리를 활용할 수 있도록 도와주는 라이브러리나 프레임워크가 존재합니다. 판다스와 유사한 기능을 제공하면서 비동기식 데이터 처리를 지원하거나, 판다스를 확장하여 비동기 기능을 추가한 솔루션들이 있습니다.

1. Dask

  • 설명:
    • Dask는 판다스와 비슷한 API를 제공하면서도 대규모 데이터 처리를 지원하는 라이브러리입니다.
    • 비동기적 작업과 분산 처리를 지원하며, 병렬 처리 및 클러스터 환경에서 작동 가능합니다.
  • 특징:
    • 대용량 데이터 처리.
    • 비동기적 계산 그래프를 사용하여 작업을 효율적으로 분배.
    • DataFrame과 Series API가 판다스와 유사.
import dask.dataframe as dd

# CSV 파일 읽기 (대용량 데이터 지원)
df = dd.read_csv('large_dataset.csv')

# 작업 수행
result = df.groupby('column_name').mean()

# 결과 계산 (지연 실행)
result = result.compute()
print(result)

2. Modin

  • 설명:
    • Modin은 판다스와 동일한 API를 제공하면서 병렬 처리 및 분산 처리를 지원하는 라이브러리입니다.
    • 내부적으로 Ray나 Dask를 사용하여 작업을 병렬화합니다.
  • 특징:
    • 기존 판다스 코드를 거의 수정하지 않고도 병렬 처리 가능.
    • 단일 노드와 분산 클러스터 환경 모두 지원.
import modin.pandas as pd

# Modin을 사용해 데이터 읽기
df = pd.read_csv("large_dataset.csv")

# Modin의 병렬 처리로 연산 수행
result = df.groupby("column_name").mean()
print(result)

3. Vaex

  • 설명:
    • Vaex는 메모리 효율적으로 대용량 데이터를 처리하기 위한 데이터프레임 라이브러리입니다.
    • 비동기적으로 데이터를 처리하며, 데이터가 메모리에 전부 올라가지 않아도 작업이 가능합니다.
  • 특징:
    • Lazy execution(지연 실행) 지원.
    • 데이터 분석 작업에 최적화된 API 제공.
    • 메모리 사용량 최소화.
import vaex

# CSV 파일 읽기
df = vaex.open('large_dataset.csv')

# Lazy Execution으로 그룹화 연산
result = df.groupby("column_name", agg="mean")
print(result)

4. Async 라이브러리와 판다스

  • 판다스 자체는 비동기적이지 않지만, Python의 asyncio와 함께 사용하여 I/O 작업을 병렬화하거나 작업을 비동기로 나눌 수 있습니다.
import pandas as pd
import asyncio

async def load_and_process(file_path):
    # CSV 읽기
    df = pd.read_csv(file_path)
    # 데이터 처리
    result = df.groupby('column_name').mean()
    return result

async def main():
    files = ['file1.csv', 'file2.csv', 'file3.csv']
    tasks = [load_and_process(file) for file in files]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

5. Polars

  • 설명:
    • Polars는 빠르고 효율적인 데이터프레임 라이브러리로, Rust로 작성되었으며 병렬 처리를 기본으로 지원합니다.
    • 비동기 기능은 포함하지 않지만, 매우 빠른 성능과 저메모리 사용량이 특징입니다.
import polars as pl

# CSV 파일 읽기
df = pl.read_csv("large_dataset.csv")

# 작업 수행
result = df.groupby("column_name").mean()
print(result)

결론

  • 대용량 데이터나 병렬 처리가 필요하다면 Dask, Modin, Vaex를 고려하세요.
  • 최고 성능이 중요하다면 Polars가 좋은 선택입니다.
  • asyncio를 활용해 판다스를 보조적으로 사용하거나, 전용 비동기 데이터 처리 프레임워크를 채택하는 방법도 있습니다.
  • 선택은 작업 크기와 요구사항(비동기 필요성, 데이터 크기, 성능)을 기반으로 결정하면 됩니다.
profile
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글