>백엔드 개발 >PHP 튜토리얼 >Python을 사용하여 대용량 파일을 읽는 방법

Python을 사용하여 대용량 파일을 읽는 방법

不言
不言원래의
2018-04-24 15:41:351926검색

이 글에서는 Python을 사용하여 대용량 파일을 읽는 방법을 주로 소개합니다. 필요하신 분들은 참고하시면 됩니다

Background

최근 텍스트 문서를 처리할 때(파일 크기가 2GB 정도) memoryError 오류가 발생합니다. 그리고 파일 읽기가 너무 느리다는 문제로 인해 나중에 더 빠른 대용량 파일 읽기 방법 두 가지를 찾았습니다. 이 기사에서는 이 두 가지 읽기 방법을 소개합니다.

준비

"텍스트 처리"에 대해 말할 때 일반적으로 처리되는 내용을 의미합니다. Python을 사용하면 텍스트 파일의 내용을 조작할 수 있는 문자열 변수로 읽는 것이 매우 쉽습니다. 파일 객체는 .read(), .readline() 및 .readlines()의 세 가지 "읽기" 메서드를 제공합니다. 각 메소드는 매번 읽는 데이터의 양을 제한하기 위해 변수를 허용할 수 있지만 일반적으로 변수를 사용하지 않습니다. .read()는 한 번에 전체 파일을 읽으며 일반적으로 파일 내용을 문자열 변수에 넣는 데 사용됩니다. 그러나 .read()는 파일 내용의 가장 직접적인 문자열 표현을 생성하지만 연속적인 줄 기반 처리에는 필요하지 않으며 파일이 사용 가능한 메모리보다 큰 경우 이러한 처리가 불가능합니다. 다음은 read() 메소드의 예입니다.

try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()

read()를 호출하면 파일의 전체 내용을 한 번에 읽습니다. 따라서 메모리가 폭발합니다. 안전한 측면에서는 read( 반복적으로.size) 메서드를 호출하여 매번 최대 size 바이트의 콘텐츠를 읽을 수 있습니다. 또한, readline()을 호출하면 한 번에 한 줄의 내용을 읽을 수 있고, readlines()를 호출하면 모든 내용을 한 번에 읽고 목록을 한 줄씩 반환할 수 있습니다. 따라서 필요에 따라 호출 방법을 결정해야 합니다.

파일이 작은 경우에는 read()를 한 번에 읽는 것이 가장 편리하고, 파일 크기를 확인할 수 없는 경우에는 read(size)를 반복해서 호출하는 것이 더 안전합니다. call readlines():

for line in f.readlines():
process(line) #

 

청크로 읽기

대용량 파일을 여러 개의 작은 파일로 나누어 처리하고 이 부분을 릴리스하는 방식으로 대용량 파일을 처리한다고 생각하기 쉽습니다. 각 작은 파일을 처리한 후의 메모리입니다. 여기에서는 Iter 및 Yield가 사용됩니다.

def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>

With open()

with 문을 사용하여 내부 블록 예외 발생을 포함하여 파일을 열고 닫습니다. for line in f file 객체 f는 반복자로 처리되며 자동으로 버퍼링된 IO 및 메모리 관리를 사용하므로 대용량 파일에 대해 걱정할 필요가 없습니다.

코드는 다음과 같습니다.

#If the file is line based
with open(...) as f:
  for line in f:
    process(line) # <do something with line>

Optimization

수백만 행이 포함된 대규모 데이터를 처리할 때 open을 사용하면 문제가 없지만 여기서 매개변수가 다르면 효율성도 달라집니다. 테스트 후, 첫 번째 매개변수가 "rb"일 때의 효율성은 "r"의 6배입니다. 이진 읽기가 여전히 가장 빠른 모드임을 알 수 있습니다.

with open(filename,"rb") as f: 
  for fLine in f: 
    pass

테스트 결과: rb 방법이 가장 빠르며 2.9초 안에 100만 행을 탐색합니다. 기본적으로 중형 및 대형 파일 처리의 효율성 요구를 충족할 수 있습니다. rb(보조 시스템 읽기)에서 읽는 것이 r(읽기 모드)로 변경되면 5~6배 느려집니다.

결론

Python을 사용하여 대용량 파일을 읽을 때는 가장 간단한 방법을 사용하고 인터프리터에게 맡기고 작업은 스스로 처리하도록 해야 합니다. 동시에 더 높은 성능을 얻기 위해 다양한 요구에 따라 다양한 판독 매개변수를 선택할 수 있습니다.

관련 권장사항:

파이썬이 텍스트 데이터를 읽고 이를 DataFrame 형식으로 변환하는 방법에 대한 자세한 설명

위 내용은 Python을 사용하여 대용량 파일을 읽는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.