초보자라도 Python에서 대규모 데이터 세트를 처리하는 방법

초보자라도 Python에서 대규모 데이터 세트를 처리하는 방법

초보자라도 Python에서 대규모 데이터 세트를 처리하는 방법초보자라도 Python에서 대규모 데이터 세트를 처리하는 방법
작성자별 이미지

# 소개

Python에서 대규모 데이터 세트로 작업하면 종종 일반적인 문제가 발생합니다. 팬더프로그램이 크롤링 속도로 느려지거나 완전히 충돌합니다. 이는 일반적으로 모든 것을 메모리에 동시에 로드하려고 하기 때문에 발생합니다.

대부분의 메모리 문제는 다음에서 비롯됩니다. 어떻게 데이터를 로드하고 처리합니다. 몇 가지 실용적인 기술을 사용하면 사용 가능한 메모리보다 훨씬 큰 데이터 세트를 처리할 수 있습니다.

이 기사에서는 Python에서 대규모 데이터 세트를 효율적으로 작업하기 위한 7가지 기술을 배웁니다. 우리는 간단하게 시작하여 구축할 것이므로 결국에는 어떤 접근 방식이 귀하의 사용 사례에 적합한지 정확히 알게 될 것입니다.

🔗 다음을 찾을 수 있습니다. GitHub의 코드. 원한다면 이것을 실행할 수 있습니다 샘플 데이터 생성기 Python 스크립트 샘플 CSV 파일을 얻고 코드 조각을 사용하여 처리합니다.

# 1. 데이터를 청크 단위로 읽기

가장 초보자에게 친숙한 접근 방식은 모든 것을 한 번에 로드하는 대신 데이터를 작은 조각으로 처리하는 것입니다.

대규모 판매 데이터 세트가 있고 총 수익을 찾으려는 시나리오를 생각해 보십시오. 다음 코드는 이 접근 방식을 보여줍니다.

import pandas as pd

# Define chunk size (number of rows per chunk)
chunk_size = 100000
total_revenue = 0

# Read and process the file in chunks
for chunk in pd.read_csv('large_sales_data.csv', chunksize=chunk_size):
    # Process each chunk
    total_revenue += chunk['revenue'].sum()

print(f"Total Revenue: ${total_revenue:,.2f}")

1,000만 개의 행을 모두 한 번에 로드하는 대신 한 번에 100,000개의 행을 로드합니다. 각 청크의 합계를 계산하여 누적 합계에 추가합니다. 파일 크기에 관계없이 RAM에는 100,000개의 행만 저장됩니다.

이것을 언제 사용하는가: 대용량 파일에 대한 집계(합계, 개수, 평균) 또는 필터링 작업을 수행해야 하는 경우.

# 2. 특정 열만 사용

데이터세트의 모든 열이 필요하지 않은 경우가 많습니다. 필요한 것만 로드하면 메모리 사용량을 크게 줄일 수 있습니다.

고객 데이터를 분석 중이지만 다른 많은 열이 아닌 연령과 구매 금액만 필요하다고 가정해 보겠습니다.

import pandas as pd

# Only load the columns you actually need
columns_to_use = ['customer_id', 'age', 'purchase_amount']

df = pd.read_csv('customers.csv', usecols=columns_to_use)

# Now work with a much lighter dataframe
average_purchase = df.groupby('age')['purchase_amount'].mean()
print(average_purchase)

지정하여 usecolsPandas는 해당 세 개의 열만 메모리에 로드합니다. 원본 파일에 50개의 열이 있는 경우 메모리 사용량이 약 94% 감소한 것입니다.

이것을 언제 사용하는가: 데이터를 로드하기 전에 필요한 열을 정확히 알고 있는 경우.

# 3. 데이터 유형 최적화

기본적으로 Pandas는 필요한 것보다 더 많은 메모리를 사용할 수 있습니다. 8비트가 제대로 작동하는 경우 정수 열은 64비트로 저장될 수 있습니다.

예를 들어 제품 평점(별 1~5개) 및 사용자 ID가 포함된 데이터 세트를 로드하는 경우:

import pandas as pd

# First, let's see the default memory usage
df = pd.read_csv('ratings.csv')
print("Default memory usage:")
print(df.memory_usage(deep=True))

# Now optimize the data types
df['rating'] = df['rating'].astype('int8')  # Ratings are 1-5, so int8 is enough
df['user_id'] = df['user_id'].astype('int32')  # Assuming user IDs fit in int32

print("\nOptimized memory usage:")
print(df.memory_usage(deep=True))

등급 열을 확률에서 변환하여 int64 (숫자당 8바이트) ~ int8 (숫자당 1바이트) 해당 열에 대해 8배의 메모리 감소를 달성합니다.

일반적인 변환에는 다음이 포함됩니다.

  • int64int8, int16또는 int32 (숫자 범위에 따라 다름)
  • float64float32 (극도의 정밀도가 필요하지 않은 경우)
  • objectcategory (반복되는 값이 있는 열의 경우)

# 4. 범주형 데이터 유형 사용

열에 반복되는 텍스트 값(예: 국가 이름 또는 제품 카테고리)이 포함된 경우 Pandas는 각 값을 별도로 저장합니다. 그만큼 category dtype은 고유한 값을 한 번 저장하고 효율적인 코드를 사용하여 이를 참조합니다.

카테고리 열에 고유한 값이 20개만 있지만 데이터세트의 모든 행에서 반복되는 제품 재고 파일로 작업한다고 가정해 보겠습니다.

import pandas as pd

df = pd.read_csv('products.csv')

# Check memory before conversion
print(f"Before: {df['category'].memory_usage(deep=True) / 1024**2:.2f} MB")

# Convert to category
df['category'] = df['category'].astype('category')

# Check memory after conversion
print(f"After: {df['category'].memory_usage(deep=True) / 1024**2:.2f} MB")

# It still works like normal text
print(df['category'].value_counts())

이 변환을 통해 카디널리티가 낮은 열(고유 값이 거의 없음)의 메모리 사용량을 크게 줄일 수 있습니다. 열은 여전히 ​​표준 텍스트 데이터와 유사하게 작동합니다. 평소와 같이 필터링, 그룹화 및 정렬할 수 있습니다.

이것을 언제 사용하는가: 값이 자주 반복되는 텍스트 열(범주, 주, 국가, 부서 등)에 사용됩니다.

# 5. 읽는 동안 필터링

행의 하위 집합만 필요하다는 것을 알고 있는 경우도 있습니다. 모든 항목을 로드한 다음 필터링하는 대신 로드 프로세스 중에 필터링할 수 있습니다.

예를 들어 2024년의 거래에만 관심이 있는 경우:

import pandas as pd

# Read in chunks and filter
chunk_size = 100000
filtered_chunks = []

for chunk in pd.read_csv('transactions.csv', chunksize=chunk_size):
    # Filter each chunk before storing it
    filtered = chunk[chunk['year'] == 2024]
    filtered_chunks.append(filtered)

# Combine the filtered chunks
df_2024 = pd.concat(filtered_chunks, ignore_index=True)

print(f"Loaded {len(df_2024)} rows from 2024")

청킹과 필터링을 결합하고 있습니다. 각 청크는 목록에 추가되기 전에 필터링되므로 전체 데이터 세트를 메모리에 보관하지 않고 실제로 원하는 행만 보관합니다.

이것을 언제 사용하는가: 일부 조건에 따라 행의 하위 집합만 필요한 경우.

# 6. 병렬 처리를 위해 Dask를 사용하세요

매우 방대한 데이터 세트의 경우 어둠 Pandas와 유사한 API를 제공하지만 모든 청크 및 병렬 처리를 자동으로 처리합니다.

대규모 데이터 세트에서 열의 평균을 계산하는 방법은 다음과 같습니다.

import dask.dataframe as dd

# Read with Dask (it handles chunking automatically)
df = dd.read_csv('huge_dataset.csv')

# Operations look just like pandas
result = df['sales'].mean()

# Dask is lazy - compute() actually executes the calculation
average_sales = result.compute()

print(f"Average Sales: ${average_sales:,.2f}")

Dask는 전체 파일을 메모리에 로드하지 않습니다. 대신 데이터를 청크로 처리하는 방법에 대한 계획을 만들고 호출할 때 해당 계획을 실행합니다. .compute(). 계산 속도를 높이기 위해 여러 CPU 코어를 사용할 수도 있습니다.

이것을 언제 사용하는가: 데이터세트가 Pandas에 비해 너무 큰 경우, 청킹을 포함하더라도 복잡한 코드를 작성하지 않고 병렬 처리를 원하는 경우.

# 7. 탐색을 위해 데이터 샘플링

단지 코드를 탐색하거나 테스트하는 경우에는 전체 데이터 세트가 필요하지 않습니다. 먼저 샘플을 로드합니다.

기계 학습 모델을 구축하고 전처리 파이프라인을 테스트한다고 가정해 보겠습니다. 다음과 같이 데이터 세트를 샘플링할 수 있습니다.

import pandas as pd

# Read just the first 50,000 rows
df_sample = pd.read_csv('huge_dataset.csv', nrows=50000)

# Or read a random sample using skiprows
import random
skip_rows = lambda x: x > 0 and random.random() > 0.01  # Keep ~1% of rows

df_random_sample = pd.read_csv('huge_dataset.csv', skiprows=skip_rows)

print(f"Sample size: {len(df_random_sample)} rows")

첫 번째 접근 방식은 빠른 탐색에 적합한 첫 번째 N개 행을 로드합니다. 두 번째 접근 방식은 파일 전체에서 행을 무작위로 샘플링합니다. 이는 통계 분석이나 맨 위 행을 대표하지 않게 만드는 방식으로 파일을 정렬하는 경우에 더 좋습니다.

이것을 언제 사용하는가: 전체 데이터 세트에서 코드를 실행하기 전 개발, 테스트 또는 탐색 분석 중입니다.

# 결론

대규모 데이터 세트를 처리하는 데는 전문가 수준의 기술이 필요하지 않습니다. 다음은 우리가 논의한 기술에 대한 간략한 요약입니다.

기술 언제 사용하는가
청킹

데이터 집계, 필터링 및 처리의 경우 RAM에 맞지 않습니다.

열 선택

광범위한 데이터 세트에서 몇 개의 열만 필요한 경우.

데이터 유형 최적화

언제나; 메모리를 절약하려면 로딩 후에 이 작업을 수행하세요.

범주형 유형

반복되는 값(범주, 상태 등)이 있는 텍스트 열의 경우.

읽는 동안 필터링하기

행의 하위 집합만 필요한 경우.

어둠

매우 큰 데이터세트의 경우 또는 병렬 처리를 원하는 경우.

견본 추출

개발 및 탐색 중.

첫 번째 단계는 데이터와 작업을 모두 아는 것입니다.. 대부분의 경우 청킹과 스마트 열 선택을 함께 사용하면 90%의 결과를 얻을 수 있습니다.

요구사항이 증가함에 따라 Dask와 같은 고급 도구로 이동하거나 데이터를 다음과 같은 보다 효율적인 파일 형식으로 변환하는 것을 고려해보세요. 쪽매 세공 또는 HDF5.

이제 대규모 데이터세트로 작업을 시작해 보세요. 분석해 보세요!

소녀 프리야 C 인도 출신의 개발자이자 기술 작가입니다. 그녀는 수학, 프로그래밍, 데이터 과학, 콘텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 분야에는 DevOps, 데이터 과학, 자연어 처리가 포함됩니다. 그녀는 읽기, 쓰기, 코딩, 커피를 즐깁니다! 현재 그녀는 튜토리얼, 방법 가이드, 의견 등을 작성하여 개발자 커뮤니티에서 자신의 지식을 학습하고 공유하는 데 힘쓰고 있습니다. Bala는 또한 매력적인 리소스 개요와 코딩 튜토리얼을 만듭니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다