파이썬에서 제공하는 자료형인 리스트(list)는 요소(element)를 임의로 추가/삭제하고 사용자의 편의대로 조작할 수 있는 다양한 기능을 제공합니다.
그런데 리스트에는 최대 몇개의 요소가 추가 될수 있는지 고민해본 사람이 있었습니다.
그사람의 말에 의하면 리스트 최대 요소 갯수는 9,223,372,036,854,775,807개 라고 합니다.
간단한 질문을 던져봅니다.
9,223,372,036,854,775,807개를 넘어가는 요소 수를 저장하는것이 가능할까요?
간단한 질문인데 생각해 볼게 많겠죠
1. "넘어가는"게 얼마나 넘어가는것인가
만약 +1,2 개라면 list 1개를 더 추가해서 저장할수 있겠지만 MAX_elements * N 개라면?
즉 list를 동적으로 생성하는 코드를 추가해야 저장가능합니다.
2. 넘어가는건 고사하고 MAX 만큼 저장은 가능한가?
자료요소 1개당 1byte로 잡아도 대량 9,223,372 TB 만큼의 저장공간이 필요하네요.
해당 저장공간을 마련할 수 있다면 저장 가능하다고 대답할 수 있겠죠.
3. 저장공간은 마련 가능한가?
MS Onedrive 개인 저장공간을 1TB 플랜(월 \8,900)을 활용한 경우 9,223,372개 구입하면 됩니다.
대략 820억 필요;;
그럼 외장하드로 하면 구글에 "최대 외장하드" 치면 24TB 짜리가 나옵니다. (\939,000/EA) 그럼 384,308개 필요하니까
3600억 필요합니다;;;;
근데.. 클라우드나 외장하드를 사용하면 프로그램에서 I/O처리를 해줘야 하잖아요? 그럼 메모리를 늘립니다.
이 저장공간을 만약 memory로 다 확보한다면 일단 64bit CPU의 최대 메모리는 16EB(Exabyte) = 16,000,000TB 이니까 메모리를 무진장 꽂는다면 가능은 하겠네요... 32GB*4 세트 메모리 가격(\840,000)으로 계산하면
비용은 60조원..ㅋ
즉, 예산만 주어진다면 가능하다가 답이겠네요. 그런데 굳이?ㅎㅎ
4. 실질적 결론
일단 일반적인 프로그래밍 환경에서는 불가능합니다.
그럼 얼마나 많은 요소를 실제 사용가능한지 확인해볼까요? 실험으로...^^
실행 소스 코드는 다음과 같습니다!!
메모리 에러가 발생하면 리스트의 사이즈를 출력하도록 하였습니다.
1
2
3
4
5
6
7
8
|
a = [0]
cnt = 1
while 1:
try:
a.append(cnt)
cnt += 1
except MemoryError as err:
print(len(a))
|
cs |
현재 8/15.9GB 사용중인 PC에서 메모리 에러 날때까지 파이썬에서 list 에 요소를 추가해봤습니다.
가용메모리 7.9GB 상황에서 381,365,332 개 추가하고 죽어버리네요 ㅎㅎ
실험대로면 리스트 요소당 20B 씩 잡아먹네요..? 위에 저장공간에 비용에 x20 추가..
결론은 내PC에 남는 메모리 byte 수 ÷ 20 만큼 사용 가능하다!!