티스토리 뷰

요즘은 '데이터'하면 파이썬을 쓰는 경우가 많습니다. 실제로 대기업에서도 데이터쪽 프로젝트 할 때는 파이썬을 사용 하고 있고 실제로 데이터 관련 라이브러리는 파이썬에 많이 나와 있어서 파이썬을 쓰게 됩니다.

그런데 파이썬이 느리다는 치명적인 단점이 있습니다.

그래서 보통은 돌려놓고 기다리면 됩니다. 하지만 작업의 복잡도가 올라갈 수록 기다리는 시간이 길어져서 코드가 복잡해지더라도 속도를 올리는 방법을 써야 할 때가 있습니다.

with open("input.txt") as f:
    data = f.readlines()
    for line in data:
        process(line)

file.read_lines() 이 function을 쓰게되면 한줄씩 읽어오기는 좋지만 input.txt의 내용이 기가바이트(gb)일 때는 일단 메모리에 다 올려놓고 처리 하기 때문에 데이터가 많다면 좋은 방법은 아닙니다.

위 데이터는 1.12GB데이터 입니다.

이 데이터를 위 코드로 읽으면 아래와 같은 시간이 걸립니다.

  시작 종료 걸린시간
데스크탑 로컬SSD 2020-12-14 11:23:30.31 2020-12-14 11:23:34.75 4.4초
데스크탑 외장SSD 2020-12-14 11:17:45.96 2020-12-14 11:17:52.21 7초
노트북 외장SSD 2020-12-14 11:20:14.39 2020-12-14 11:20:27.22 13초
노트북 로컬SSD 2020-12-14 11:26:41.53 2020-12-14 11:26:57.22 16초

데스크탑은 3~4배 빠르긴 하지만 보통 노트북으로 작업을 많이 하기 때문에 노트북에서는 1GB 읽는데도 10초 이상 걸리는 것을 알 수 있습니다.

'CPU가 옛날꺼 아니냐' 하실수 있는데 데스크탑, 노트북 모두 2020년도에 산 제품들이고 노트북은 게이밍 노트북은 아니고 업무용이긴 합니다.

데이터가 커지면 .read_lines()는 좋은 방법이 아닙니다. 데이터 분석가 코딩테스트를 볼 때 .read_lines()를 쓰시면 감점입니다.(실제 제 경험)

그래서 어떻게 하느냐?

with open("input.txt") as f:
    for line in f:
        process(line)

이렇게 하시면 됩니다.

메모리로 모두 읽은 후 처리하지 않고 한줄씩 읽어서 처리 합니다.

N = 30
with open('input.txt', encoding='utf-8') as myfile:
    head = [next(myfile) for x in range(N)]
print(len(head))
for l in head:
    print(l)

위 코드는 input.txt의 top 30줄만 읽는 코드 입니다.

 

데이터 형태만 알고 싶을 때는 파일을 모두 읽지 않아도 됩니다. 위에서 N줄만 읽어보면 필드명 들은 다 알 수 있습니다.

 

 

 

 

 

참고

www.blopig.com/blog/2016/08/processing-large-files-using-python/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함