Rianshin

[๊ฐœ๋ฐœ์ž ์‹คํ—˜] ๋Œ€์šฉ๋Ÿ‰ CSV ์ฒ˜๋ฆฌ, ์ž๋ฐ”๊ฐ€ ๋ฌด์กฐ๊ฑด ๋” ๋น ๋ฅผ๊นŒ? (๋ฉ”๋ชจ๋ฆฌ vs ์†๋„ ์ง„์‹ค ๊ฒŒ์ž„) ๋ณธ๋ฌธ

Develop

[๊ฐœ๋ฐœ์ž ์‹คํ—˜] ๋Œ€์šฉ๋Ÿ‰ CSV ์ฒ˜๋ฆฌ, ์ž๋ฐ”๊ฐ€ ๋ฌด์กฐ๊ฑด ๋” ๋น ๋ฅผ๊นŒ? (๋ฉ”๋ชจ๋ฆฌ vs ์†๋„ ์ง„์‹ค ๊ฒŒ์ž„)

RianShin 2026. 2. 10. 13:44
728x90
๋ฐ˜์‘ํ˜•
SMALL

๐Ÿ“ ์„œ๋ก : "์ž๋ฐ”๋Š” ๋ฌด๊ฒ์ง€๋งŒ ๋น ๋ฅด๊ณ , ํŒŒ์ด์ฌ์€ ๊ฐ€๋ณ์ง€๋งŒ ๋А๋ฆฌ๋‹ค?"

๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ํ”ํžˆ ํ†ต์šฉ๋˜๋Š” ๋ช…์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

"CPU ์—ฐ์‚ฐ์€ ์ž๋ฐ”(Java)๊ฐ€ ์••๋„์ ์ด๊ณ , ํŒŒ์ด์ฌ(Python)์€ ๋А๋ฆฌ๋‹ค."

๋งž๋Š” ๋ง์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๊ทผ ํ”„๋กœ์ ํŠธ์—์„œ ๋Œ€์šฉ๋Ÿ‰ CSV ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. "๋‹จ์ˆœ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š”(Load) ํšจ์œจ์„ฑ์€ ์–ด๋–จ๊นŒ?"

ํŠนํžˆ ๋ฐ์ดํ„ฐ ๋ถ„์„์ด๋‚˜ AI ์ „์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ˆ˜ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ(GB) ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค์•ผ ํ•  ๋•Œ, ์˜์™ธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ž๋ฐ”์™€ ํŒŒ์ด์ฌ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์˜ ๊ฒฐ์ •์  ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ  ์™œ ๋ฐ์ดํ„ฐ ๋ถ„์„์—๋Š” ํŒŒ์ด์ฌ(Pandas)์„ ์“ฐ๋ผ๊ณ  ํ•˜๋Š”์ง€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํŒŒํ—ค์ณ ๋ด…๋‹ˆ๋‹ค.


1. ๐Ÿ” ์‹คํ—˜ ์ƒํ™ฉ: 100๋งŒ ํ–‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค๋ฉด?

๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์ •์ˆ˜(Integer)์™€ ๋ฌธ์ž์—ด(String)์ด ์„ž์ธ 1GB ํฌ๊ธฐ์˜ CSV ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ํ†ต์งธ๋กœ ๋กœ๋”ฉ(In-Memory)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Java: List<MyObject> ๋˜๋Š” ArrayList<String[]> ํ˜•ํƒœ๋กœ ๋กœ๋”ฉ
  • Python: Pandas DataFrame์œผ๋กœ ๋กœ๋”ฉ

๊ฒฐ๊ณผ๋Š” ์–ด๋• ์„๊นŒ์š”?

  • ํŒŒ์ด์ฌ (Pandas): ์›๋ณธ ํŒŒ์ผ ํฌ๊ธฐ์˜ ์•ฝ 2~3๋ฐฐ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ
  • ์ž๋ฐ” (List ๊ฐ์ฒด): ์›๋ณธ ํŒŒ์ผ ํฌ๊ธฐ์˜ ์•ฝ 5~10๋ฐฐ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ (!!)

์ž๋ฐ”๊ฐ€ ํŒŒ์ด์ฌ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ›จ์”ฌ ๋” ๋งŽ์ด ์žก์•„๋จน๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ์š”?


2. ๐Ÿ’ก ์›์ธ ๋ถ„์„: '๊ฐ์ฒด(Object)'์˜ ๋ฐฐ์‹ 

๋ฒ”์ธ์€ ๋ฐ”๋กœ ์ž๋ฐ”์˜ **๊ฐ์ฒด ํ—ค๋”(Object Header)**์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ์ž๋ฐ”์˜ "๊ฐœ๋ณ„ ํฌ์žฅ" ๋ฐฉ์‹ (Row-Oriented)

์ž๋ฐ”์—์„œ List<Integer>๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ž๋ฐ”๋Š” ๋ชจ๋“  ๊ฒƒ์„ '๊ฐ์ฒด'๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ฐ’ 10์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Integer ๋ž˜ํผ ํด๋ž˜์Šค(Wrapper Class)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฐ์ฒด ํ•˜๋‚˜์—๋Š” ์‹ค์ œ ๊ฐ’(4byte)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด ํ—ค๋”(Mark Word, Class Pointer ๋“ฑ ์•ฝ 12byte ์ด์ƒ)๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค.
  • 100๋งŒ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, 100๋งŒ ๊ฐœ์˜ ๊ฐ์ฒด ํ—ค๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์‚ฌํƒ• ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ณผ๋Œ€ ํฌ์žฅ์ง€๋กœ ์‹ธ๋†“์€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ๋‹ค๊ฐ€ ์ด ๊ฐ์ฒด๋“ค์€ ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์—ฌ๊ธฐ์ €๊ธฐ์— ์‚ฐ์žฌํ•ด ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋Œ€์ƒ์ด ํญ์ฆํ•ฉ๋‹ˆ๋‹ค.

โ‘ก ํŒŒ์ด์ฌ(Pandas)์˜ "๋ฒŒํฌ ํฌ์žฅ" ๋ฐฉ์‹ (Column-Oriented)

๋ฐ˜๋ฉด ํŒŒ์ด์ฌ์˜ Pandas๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ **NumPy(C์–ธ์–ด ๊ธฐ๋ฐ˜)**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • int ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค๋ฉด, ํŒŒ์ด์ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ C ์Šคํƒ€์ผ์˜ **์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ์—ด(Array)**์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ํฌ์žฅ์ง€(ํ—ค๋”) ์—†์ด ์•Œ๋งน์ด(๋ฐ์ดํ„ฐ)๋งŒ ๋นฝ๋นฝํ•˜๊ฒŒ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ์œ„์น˜ํ•˜๋ฏ€๋กœ CPU ์บ์‹œ ์ ์ค‘๋ฅ (Cache Hit)๋„ ๋†’์•„์ ธ ์กฐํšŒ ์†๋„๋„ ๋น ๋ฆ…๋‹ˆ๋‹ค.

3. โš–๏ธ ์Šน์ž๋Š”? ์ƒํ™ฉ๋ณ„ ์„ ํƒ ๊ฐ€์ด๋“œ

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ํŒŒ์ด์ฌ์ด ์ข‹์„๊นŒ์š”? ์•„๋‹™๋‹ˆ๋‹ค. **'๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃฐ ๊ฒƒ์ธ๊ฐ€'**์— ๋”ฐ๋ผ ์Šน์ž๊ฐ€ ๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค.

๋น„๊ต ํ•ญ๋ชฉ ํŒŒ์ด์ฌ (Pandas) ๐Ÿ ์ž๋ฐ” (Java Stream) โ˜•
ํ•ต์‹ฌ ๊ฐ•์  ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ & ๋ถ„์„ ํŽธ์˜์„ฑ ์ฒ˜๋ฆฌ ์†๋„ & ์•ˆ์ •์„ฑ
์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ „์ฒด ๋กœ๋”ฉ (In-Memory) ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์ค„์”ฉ ํ˜๋ ค๋ณด๋ƒ„ (Streaming)
์ ํ•ฉํ•œ ์ƒํ™ฉ ๋ฐ์ดํ„ฐ ํ†ต๊ณ„, ๋ถ„์„, AI ํ•™์Šต, ์‹œ๊ฐํ™” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜(ETL), ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ์ฒ˜๋ฆฌ
๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ (Columnar) - C ๋ฐฐ์—ด ๊ตฌ์กฐ ๋กœ์šฐ ๊ธฐ๋ฐ˜ (Row) - ๊ฐ์ฒด ์ฐธ์กฐ ๊ตฌ์กฐ

โœ… ํŒŒ์ด์ฌ์„ ์จ์•ผ ํ•  ๋•Œ

  • ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋‘๊ณ  group by, join, sort ๋“ฑ ๋ณต์žกํ•œ ํ†ต๊ณ„ ๋ถ„์„์„ ํ•ด์•ผ ํ•  ๋•Œ.
  • Pandas๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ(C ๋ ˆ๋ฒจ ์ตœ์ ํ™”)๋ฅผ ์•Œ์•„์„œ ํ•ด์ฃผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ์••๋„์ ์ž…๋‹ˆ๋‹ค.

โœ… ์ž๋ฐ”๋ฅผ ์จ์•ผ ํ•  ๋•Œ

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค ์˜ฌ๋ฆด ํ•„์š” ์—†์ด, ์ฝ์–ด์„œ -> ๋ณ€ํ™˜ํ•˜๊ณ  -> DB์— ๋„ฃ๋Š”(ETL) ์ž‘์—…์ผ ๋•Œ.
  • BufferedReader๋‚˜ Stream API๋ฅผ ์‚ฌ์šฉํ•ด ํ•œ ์ค„์”ฉ ์ฒ˜๋ฆฌํ•˜๋ฉด(Streaming), 100GB ํŒŒ์ผ๋„ ์ˆ˜์‹ญ MB์˜ ๋ฉ”๋ชจ๋ฆฌ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ JIT ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์ ํ™” ๋•๋ถ„์— ์‹คํ–‰ ์†๋„๋Š” ์ž๋ฐ”๊ฐ€ ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

4. ๐Ÿš€ ๊ฒฐ๋ก : ๋„๊ตฌ์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜์ž

"์ž๋ฐ”๋Š” ๋ฌด๊ฒ๋‹ค"๋Š” ๋ฐ˜์€ ๋งž๊ณ  ๋ฐ˜์€ ํ‹€๋ฆฝ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ํž™์— ์ž”๋œฉ ์Œ“์•„๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋”ฉํ•˜๋ฉด ์ž๋ฐ”๋Š” ์ •๋ง ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ŠคํŠธ๋ฆผ(Stream) ๋ฐฉ์‹์œผ๋กœ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋ฉด ์ž๋ฐ”๋Š” ๋ˆ„๊ตฌ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ "์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ˆˆ์— ๋ด์•ผ ํ•˜๋Š”๊ฐ€(๋ถ„์„)?" ์•„๋‹ˆ๋ฉด **"์ง€๋‚˜๊ฐ€๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€(ํŒŒ์ดํ”„๋ผ์ธ)?"**๋ฅผ ๋จผ์ € ๊ณ ๋ฏผํ•ด ๋ณด์„ธ์š”. ๊ทธ ์งˆ๋ฌธ์ด ๋ฐ”๋กœ ํŒŒ์ด์ฌ๊ณผ ์ž๋ฐ” ์ค‘ ๋ฌด์—‡์„ ์„ ํƒํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋‚˜์นจ๋ฐ˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
LIST
Comments