여러 파일 다루기

여러 파일 다루기

Polars는 여러 개의 파일을 다룰 때, 상황과 메모리 부담에 따라 서로 다른 방식으로 처리할 수 있어요. 파일을 하나로 합쳐 읽을 수도 있고, 각 파일을 개별 쿼리로 병렬 처리할 수도 있습니다.

출처: 공식문서

먼저 예제로 쓸 파일들을 만들어 볼게요.

import polars as pl

df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "ham", "spam"]})

for i in range(5):
    df.write_csv(f"docs/assets/data/my_many_files_{i}.csv")

단일 DataFrame으로 읽기

여러 파일을 하나의 DataFrame으로 읽으려면 글로빙(globbing) 패턴을 쓰면 됩니다.

df = pl.read_csv("docs/assets/data/my_many_files_*.csv")
print(df)
shape: (15, 2)
┌─────┬──────┐
│ foo ┆ bar  │
│ --- ┆ ---  │
│ i64 ┆ str  │
╞═════╪══════╡
│ 1   ┆ null │
│ 2   ┆ ham  │
│ 3   ┆ spam │
│ 1   ┆ null │
│ 2   ┆ ham  │
│ …   ┆ …    │
│ 2   ┆ ham  │
│ 3   ┆ spam │
│ 1   ┆ null │
│ 2   ┆ ham  │
│ 3   ┆ spam │
└─────┴──────┘

이게 어떻게 동작하는지 쿼리 플랜을 보면, 모든 파일이 개별적으로 읽힌 뒤 하나의 DataFrame으로 이어 붙여진다는 걸 알 수 있어요. Polars는 이 읽기를 병렬화하려고 시도합니다.

pl.scan_csv("docs/assets/data/my_many_files_*.csv").show_graph(plan_stage="ir")

병렬로 읽고 처리하기

파일들이 반드시 하나의 테이블에 있어야 하는 건 아니면, 각 파일에 대한 쿼리 플랜을 각각 만들어 Polars 스레드 풀에서 병렬로 실행할 수도 있습니다.

모든 쿼리 플랜 실행은 완전히 병렬적(embarrassingly parallel)이며 어떤 통신도 필요하지 않아요.

import glob

import polars as pl

queries = []
for file in glob.glob("docs/assets/data/my_many_files_*.csv"):
    q = pl.scan_csv(file).group_by("bar").agg(pl.len(), pl.sum("foo"))
    queries.append(q)

dataframes = pl.collect_all(queries)
print(dataframes)
[shape: (3, 3)
┌──────┬─────┬─────┐
│ bar  ┆ len ┆ foo │
│ ---  ┆ --- ┆ --- │
│ str  ┆ u32 ┆ i64 │
╞══════╪═════╪═════╡
│ spam ┆ 1   ┆ 3   │
│ null ┆ 1   ┆ 1   │
│ ham  ┆ 1   ┆ 2   │
└──────┴─────┴─────┘, shape: (3, 3)
┌──────┬─────┬─────┐
│ bar  ┆ len ┆ foo │
│ ---  ┆ --- ┆ --- │
│ str  ┆ u32 ┆ i64 │
╞══════╪═════╪═════╡
│ null ┆ 1   ┆ 1   │
│ ham  ┆ 1   ┆ 2   │
│ spam ┆ 1   ┆ 3   │
└──────┴─────┴─────┘, shape: (3, 3)
┌──────┬─────┬─────┐
│ bar  ┆ len ┆ foo │
│ ---  ┆ --- ┆ --- │
│ str  ┆ u32 ┆ i64 │
╞══════╪═════╪═════╡
│ null ┆ 1   ┆ 1   │
│ spam ┆ 1   ┆ 3   │
│ ham  ┆ 1   ┆ 2   │
└──────┴─────┴─────┘, shape: (3, 3)
┌──────┬─────┬─────┐
│ bar  ┆ len ┆ foo │
│ ---  ┆ --- ┆ --- │
│ str  ┆ u32 ┆ i64 │
╞══════╪═════╪═════╡
│ ham  ┆ 1   ┆ 2   │
│ null ┆ 1   ┆ 1   │
│ spam ┆ 1   ┆ 3   │
└──────┴─────┴─────┘, shape: (3, 3)
┌──────┬─────┬─────┐
│ bar  ┆ len ┆ foo │
│ ---  ┆ --- ┆ --- │
│ str  ┆ u32 ┆ i64 │
╞══════╪═════╪═════╡
│ null ┆ 1   ┆ 1   │
│ spam ┆ 1   ┆ 3   │
│ ham  ┆ 1   ┆ 2   │
└──────┴─────┴─────┘]

더 알아보기 (Learn more)

  • CSV 외 다른 형식의 파일 입출력은 입출력 개요 문서를 보세요.
  • 데이터베이스에서 직접 읽고 쓰는 방법은 데이터베이스 문서에서 다룹니다.