Skip to main content

Safe atomic file writer for Pandas, Polars, NumPy, and other data objects

Project description

Atio ๐Ÿ›ก๏ธ

์•ˆ์ „ํ•˜๊ณ  ์›์ž์ ์ธ ํŒŒ์ผ ์“ฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
Pandas, Polars, NumPy ๋“ฑ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ์ €์žฅ ์‹œ ํŒŒ์ผ ์†์ƒ ์—†์ด, ํŠธ๋žœ์žญ์…˜์ฒ˜๋Ÿผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ

  • โœ… ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์Šคํ…Œ์ด์ง• ํ›„ ์›์ž์  ํŒŒ์ผ ๊ต์ฒด
  • ๐Ÿ“ฆ Pandas, Polars, NumPy ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ์ง€์›
  • ๐Ÿ“ _SUCCESS ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ ์ƒ์„ฑ โ€” ์ €์žฅ ์™„๋ฃŒ ์—ฌ๋ถ€ ํ‘œ์‹œ
  • ๐Ÿ›  ์‹คํŒจ ์‹œ ์›๋ณธ ํŒŒ์ผ ๋ณด์กด, ์ž„์‹œ ํŒŒ์ผ ์ž๋™ ์ •๋ฆฌ
  • ๐Ÿงฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅ์„ฑ ์ข‹์Œ
  • ๐Ÿ” ์„ฑ๋Šฅ ์ง„๋‹จ ๋กœ๊น… โ€” ๊ฐ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋ฐ ๋ณ‘๋ชฉ์  ๋ถ„์„

๐Ÿ” ์„ฑ๋Šฅ ์ง„๋‹จ ๋กœ๊น… (NEW!)

Atio๋Š” ์ด์ œ ์„ฑ๋Šฅ ์ง„๋‹จ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. verbose=True ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜์—ฌ ๋ณ‘๋ชฉ์ ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (๊ฐ„๋‹จํ•œ ์ •๋ณด๋งŒ):

import atio as aw
import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})

# ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• - ๊ฐ„๋‹จํ•œ ์„ฑ๊ณต/์‹คํŒจ ์ •๋ณด๋งŒ
aw.write(df, "output.parquet", format="parquet")

์ถœ๋ ฅ ์˜ˆ์‹œ:

[INFO] ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ: /tmp/tmp_xxx
[INFO] ์ž„์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ: /tmp/tmp_xxx/output.parquet
[INFO] ์‚ฌ์šฉํ•  writer: to_parquet (format: parquet)
[INFO] ๋ฐ์ดํ„ฐ ์ž„์‹œ ํŒŒ์ผ์— ์ €์žฅ ์™„๋ฃŒ: /tmp/tmp_xxx/output.parquet
[INFO] ์›์ž์  ๊ต์ฒด ์™„๋ฃŒ: /tmp/tmp_xxx/output.parquet -> output.parquet
[INFO] _SUCCESS ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ ์ƒ์„ฑ: output.parquet._SUCCESS
[INFO] Atomic write completed successfully (took 0.2359s)

์ƒ์„ธ ์ง„๋‹จ ๋ชจ๋“œ (verbose=True):

# ์ƒ์„ธํ•œ ์„ฑ๋Šฅ ์ง„๋‹จ ์ •๋ณด ์ถœ๋ ฅ
aw.write(df, "output.parquet", format="parquet", verbose=True)

์ถœ๋ ฅ ์˜ˆ์‹œ:

[INFO] ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ: /tmp/tmp_xxx
[INFO] ์ž„์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ: /tmp/tmp_xxx/output.parquet
[INFO] ์‚ฌ์šฉํ•  writer: to_parquet (format: parquet)
[INFO] ๋ฐ์ดํ„ฐ ์ž„์‹œ ํŒŒ์ผ์— ์ €์žฅ ์™„๋ฃŒ: /tmp/tmp_xxx/output.parquet
[INFO] ์›์ž์  ๊ต์ฒด ์™„๋ฃŒ: /tmp/tmp_xxx/output.parquet -> output.parquet
[INFO] _SUCCESS ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ ์ƒ์„ฑ: output.parquet._SUCCESS
[DEBUG] Atomic write step timings (SUCCESS): setup=0.0012s, write_call=0.2345s, replace=0.0001s, success_flag=0.0001s, total=0.2359s

์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ (๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•):

[INFO] ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ: /tmp/tmp_xxx
[INFO] ์ž„์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ: /tmp/tmp_xxx/output.parquet
[INFO] ์‚ฌ์šฉํ•  writer: to_parquet (format: parquet)
[ERROR] ์ž„์‹œ ํŒŒ์ผ ์ €์žฅ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ: [Errno 28] No space left on device
[INFO] Atomic write failed during write stage (took 0.1246s, error: OSError)

์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ (verbose=True):

[INFO] ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ: /tmp/tmp_xxx
[INFO] ์ž„์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ: /tmp/tmp_xxx/output.parquet
[INFO] ์‚ฌ์šฉํ•  writer: to_parquet (format: parquet)
[ERROR] ์ž„์‹œ ํŒŒ์ผ ์ €์žฅ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ: [Errno 28] No space left on device
[DEBUG] Atomic write step timings (ERROR during write): setup=0.0012s, write_call=0.1234s (์‹คํŒจ), replace=N/A, success_flag=N/A, total=0.1246s, error_type=OSError

์ธก์ •๋˜๋Š” ๋‹จ๊ณ„:

  • setup: ์ž„์‹œ ํด๋” ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐ ์„ค์ •
  • write_call: ์‹ค์ œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ (๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ์†Œ์š”)
  • replace: ์›์ž์  ํŒŒ์ผ ๊ต์ฒด
  • success_flag: _SUCCESS ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ ์ƒ์„ฑ
  • total: ์ „์ฒด ์ž‘์—… ์‹œ๊ฐ„

์ง€์›ํ•˜๋Š” ์˜ค๋ฅ˜ ์ƒํ™ฉ:

  • โœ… KeyboardInterrupt: ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ์ ๊ณผ ์†Œ์š” ์‹œ๊ฐ„ ํ‘œ์‹œ
  • โœ… ๊ถŒํ•œ ์˜ค๋ฅ˜: ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ถŒํ•œ ๋ฌธ์ œ ์ง„๋‹จ
  • โœ… ๋””์Šคํฌ ๊ณต๊ฐ„ ๋ถ€์กฑ: ์ €์žฅ ๊ณต๊ฐ„ ๋ถ€์กฑ ์ƒํ™ฉ ์ง„๋‹จ
  • โœ… ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ: ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ• ์ƒํ™ฉ ์ง„๋‹จ
  • โœ… ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜: ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ธŒ ์ ‘๊ทผ ๋ฌธ์ œ ์ง„๋‹จ
  • โœ… ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹: ์ž˜๋ชป๋œ ํŒŒ์ผ ํ˜•์‹ ์ง€์ • ์‹œ ์ง„๋‹จ
  • โœ… ๋™์‹œ ์ ‘๊ทผ ์˜ค๋ฅ˜: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ์˜ ์ถฉ๋Œ ์ง„๋‹จ

์žฅ์ :

  • ๐ŸŽฏ ์ •ํ™•ํ•œ ๋ณ‘๋ชฉ์  ํŒŒ์•…: Atio ์˜ค๋ฒ„ํ—ค๋“œ vs ์‹ค์ œ ์“ฐ๊ธฐ ์ž‘์—… ์‹œ๊ฐ„ ๊ตฌ๋ถ„
  • ๐Ÿ”ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ: ์–ด๋А ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ‘œ์‹œ
  • ๐Ÿ› ๋””๋ฒ„๊น… ์‹œ๊ฐ„ ๋‹จ์ถ•: ๋ฌธ์ œ์˜ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•… ๊ฐ€๋Šฅ
  • ๐Ÿ“Š ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ์„ฑ๋Šฅ ์ถ”์ 
  • ๐Ÿšจ ์˜ค๋ฅ˜ ์ง„๋‹จ: ์‹คํŒจ ์ƒํ™ฉ์—์„œ๋„ ์ •ํ™•ํ•œ ์›์ธ๊ณผ ๋ฐœ์ƒ ์‹œ์  ํŒŒ์•…

๐Ÿง  ์™œ ์ด ๋„๊ตฌ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•œ๊ฐ€์š”?

NumPy๋‚˜ Pandas๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ๋Š” ์ตœ์ ์ด์ง€๋งŒ, ํŒŒ์ผ๋กœ ์ €์žฅํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํŒŒ์ผ ์ผ๋ถ€๋งŒ ์ €์žฅ๋˜์–ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Œ โ€” ๊ฐ•์ œ ์ข…๋ฃŒ๋‚˜ ์˜ค๋ฅ˜ ์‹œ
  2. ๋™์‹œ ์“ฐ๊ธฐ ์ถฉ๋Œ โ€” ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ์ด ์—‰ํ‚ฌ ์ˆ˜ ์žˆ์Œ
  3. ํ”Œ๋žซํผ ๊ฐ„ ๋™์ž‘ ์ฐจ์ด โ€” Windows์™€ Linux/macOS์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋™์ž‘์ด ๋‹ค๋ฆ„

AtomicWriter๋Š” ์ž„์‹œ ํŒŒ์ผ์— ์“ฐ๊ณ  ๋‹จ์ผ rename()/replace() ์ž‘์—…์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์€ โ€œ์™„์ „ํžˆ ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์ €์žฅ๋˜์ง€ ์•Š๋Š”โ€ ์›์ž์„ฑ(atomicity)์„ ๋ณด์žฅํ•˜๋ฉฐ,

  • POSIX: os.replace (atomic), fsync
  • Windows: MoveFileEx, Commit
    ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด ํ•ญ์ƒ ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค :contentReference[oaicite:1]{index=1}.

โš™๏ธ ์„ค์น˜

pip install atomicwriter

## ๐Ÿ› ๏ธ ์‚ฌ์šฉ ์˜ˆ์ œ

```python
import atomicwriter as aw
import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})

# ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•
aw.write(df, "output.parquet", format="parquet")
# โ”‚โ†’ ์ž„์‹œ ํŒŒ์ผ ์ž‘์„ฑ โ†’ ์›์ž์  ๊ต์ฒด โ†’ _SUCCESS ์ƒ์„ฑ
# โ”‚โ†’ ์‹คํŒจ ์‹œ ์›๋ณธ ๋ณด์กด, ์ž„์‹œ ํŒŒ์ผ ์ž๋™ ์ •๋ฆฌ

# ์ƒ์„ธ ์„ฑ๋Šฅ ์ง„๋‹จ ๋กœ๊น… ํ™œ์„ฑํ™”
aw.write(df, "output_verbose.parquet", format="parquet", verbose=True)
# โ”‚โ†’ ๊ฐ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ๋ฐ ๋กœ๊ทธ ์ถœ๋ ฅ

# ์ง„ํ–‰๋„ ํ‘œ์‹œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
aw.write(df, "output_progress.parquet", format="parquet", show_progress=True)
# โ”‚โ†’ ์‹ค์‹œ๊ฐ„ ์ง„ํ–‰๋„ ํ‘œ์‹œ

# ๋ชจ๋“  ์˜ต์…˜ ์กฐํ•ฉ
aw.write(df, "output_full.parquet", format="parquet", 
         verbose=True, show_progress=True)
# โ”‚โ†’ ์„ฑ๋Šฅ ์ง„๋‹จ + ์ง„ํ–‰๋„ ํ‘œ์‹œ

๐Ÿ’ก ๋น…๋ฐ์ดํ„ฐ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์žฅ์ 
Pandas โ†’ CSV ์ €์žฅ ์ž„์‹œ ํŒŒ์ผ์— ๊ธฐ๋ก ํ›„ ๊ต์ฒด CSV ํŒŒ์ผ ๊นจ์ง ๋ฐฉ์ง€
๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ๋ณ‘๋ ฌ ์“ฐ๊ธฐ atomic replace ๋ฐฉ์‹ ์‚ฌ์šฉ ์ถฉ๋Œ ์—†๋Š” ์•ˆ์ „ ์ €์žฅ
๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—… ์ €์žฅ ์„ฑ๊ณต ์‹œ _SUCCESS ํ™•์ธ ๋ฐ์ดํ„ฐ ์™„์ „์„ฑ ๋ณด์žฅ

๐Ÿ”„ ๋น„๊ต โ€“ ์œ ์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠน์ง• ์ •๋ฆฌ

python-atomicwrites

  • ๊ฐ„ํŽธํ•œ API
  • Windows ์ง€์›
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ˜ธํ™˜

atomicwriter (๋ณธ ํ”„๋กœ์ ํŠธ)

  • โœ… ๊ฒฝ๋Ÿ‰
  • โœ… ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜
  • โœ… Pandas / Polars / Numpy ๋“ฑ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ์ค‘์‹ฌ ์ €์žฅ ์ง€์›

โœ… ๋ผ์ด์„ ์Šค

Apache 2.0 โ€” ๊ธฐ์—… ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ชจ๋‘ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


โœจ ์š”์•ฝ

AtomicWriter๋Š” ๋ถ„์„๋งŒํผ ์ค‘์š”ํ•œ โ€œ์ €์žฅโ€ ๋‹จ๊ณ„๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ํ™˜๊ฒฝ์—์„œ
(์˜ˆ: ๋จธ์‹ ๋Ÿฌ๋‹ ๋ฐฐ์น˜, ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ๋ถ„์„, ์ค‘์š” ๋กœ๊ทธ ์ €์žฅ ๋“ฑ)
์ž‘์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“˜ ์‹œ๋‚˜๋ฆฌ์˜ค 1: Pandas CSV ์ €์žฅ ์ค‘ ์ž‘์—… ์ค‘๋‹จ ๋ฌธ์ œ ์ƒํ™ฉ: ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ Pandas๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ .csv ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋˜ ์ค‘, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ „์› ์ฐจ๋‹จ์ด๋‚˜ ์ปค๋„ ๊ฐ•์ œ ์ข…๋ฃŒ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ํŒŒ์ผ์€ 50MB ์ค‘ 3MB๋งŒ ์ €์žฅ๋œ ์ฑ„ ์†์ƒ๋˜์—ˆ๊ณ , ์ดํ›„ ์ฝ๊ธฐ๋„ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

AtomicWriter๋กœ ํ•ด๊ฒฐ: ์ž„์‹œ ํŒŒ์ผ์— ๋จผ์ € ๊ธฐ๋ก ํ›„, ๋ชจ๋“  ์“ฐ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ๋งŒ ์›๋ณธ๊ณผ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„์— ๊บผ์ ธ๋„ ๊ธฐ์กด ํŒŒ์ผ์€ ๋ณด์กด๋˜๊ณ , ์†์ƒ๋œ ์ž„์‹œ ํŒŒ์ผ์€ ์ž๋™ ์ •๋ฆฌ๋˜์–ด ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜ ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด(Race Condition) ๋ฌธ์ œ ์ƒํ™ฉ: Python multiprocessing ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋กœ๊ทธ ํŒŒ์ผ์ด ๋ฎ์–ด์“ฐ์—ฌ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜, ์ผ๋ถ€ JSON ํŒŒ์ผ์€ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ์†์ƒ๋œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋์Šต๋‹ˆ๋‹ค.

AtomicWriter๋กœ ํ•ด๊ฒฐ: ํŒŒ์ผ ์“ฐ๊ธฐ๋ฅผ atomic replace ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ตœ์ข… ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ๊ฒฝ์Ÿ ์กฐ๊ฑด ์—†์ด ์ถฉ๋Œ ์—†์ด ์ €์žฅ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“˜ ์‹œ๋‚˜๋ฆฌ์˜ค 3: ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ ๋ถˆ๊ฐ€ ๋ฌธ์ œ ์ƒํ™ฉ: ETL ์ž‘์—…์—์„œ .parquet ์ €์žฅ์ด ์™„๋ฃŒ๋๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ž๋™ ์‹œ์Šคํ…œ์ด ํŒ๋‹จํ•  ์ˆ˜ ์—†์–ด, ์†์ƒ๋˜๊ฑฐ๋‚˜ ๋ฏธ์™„์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋ธ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ๊ฒฐ์ธก๊ฐ’์ด ํฌํ•จ๋˜์–ด ํ’ˆ์งˆ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

AtomicWriter๋กœ ํ•ด๊ฒฐ: ์ €์žฅ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ์—๋งŒ _SUCCESS ํ”Œ๋ž˜๊ทธ ํŒŒ์ผ์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„์† ๋‹จ๊ณ„๋Š” _SUCCESS ์œ ๋ฌด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜ ์‹œ๋‚˜๋ฆฌ์˜ค 4: Polars DataFrame์„ S3๋กœ ์ €์žฅ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๋ฌธ์ œ ์ƒํ™ฉ: Polars DataFrame์„ AWS S3์— ์ง์ ‘ ์ €์žฅํ•˜๋Š” ์ค‘๊ฐ„์— ConnectionError๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ S3์—๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ๊นจ์ง„ .parquet ํŒŒ์ผ์ด ์˜ฌ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฒˆ ์‹คํ–‰์—์„œ ์ด ํŒŒ์ผ์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์ง€๋งŒ, S3์—์„œ ํŒŒ์ผ์ด ์†์ƒ๋œ ์ฑ„๋กœ ์กด์žฌํ•ด ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

AtomicWriter๋กœ ํ•ด๊ฒฐ: ๋กœ์ปฌ ์ž„์‹œ ํŒŒ์ผ์— ์™„์ „ํžˆ ์ €์žฅ๋œ ํ›„์—๋งŒ S3 ์—…๋กœ๋“œ ๋˜๋Š” ๊ต์ฒด๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ด์Šˆ๋‚˜ ๋””์Šคํฌ ์˜ค๋ฅ˜์—๋„ ์ตœ์ข… ํŒŒ์ผ์€ ํ•ญ์ƒ ์™„์ „ํ•œ ์ƒํƒœ๋กœ๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

atio-2.0.0.tar.gz (37.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

atio-2.0.0-py3-none-any.whl (27.5 kB view details)

Uploaded Python 3

File details

Details for the file atio-2.0.0.tar.gz.

File metadata

  • Download URL: atio-2.0.0.tar.gz
  • Upload date:
  • Size: 37.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for atio-2.0.0.tar.gz
Algorithm Hash digest
SHA256 ad3490451619c43ed6553157a23410ee7618ed58a1eb8b9d79dc947e7dd1b535
MD5 3726a6a8a9d0146d8f9820d62a9cfd51
BLAKE2b-256 274085c70aebfb44320c644018368e4b9d9042118d91f52e25bae51297f28901

See more details on using hashes here.

File details

Details for the file atio-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: atio-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 27.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for atio-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5c274f9267019a20461f88d08c5765e0150fc1035db83a8a7508c83cf9e602a3
MD5 39316766c722317216d419fc89af97f9
BLAKE2b-256 3d7910c87a6d3d39ad68125bcb461625e8d1c1c8ad5f70b9021553673344977a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page