거대한 CSV 파일 읽기: 메모리 및 속도 최적화
수백만 개의 행과 수백 개의 열로 구성된 대용량 CSV 파일을 처리하려고 할 때 기존의 반복자를 사용하는 접근 방식은 메모리 관련 문제로 이어질 수 있습니다. 이 문서에서는 Python 2.7에서 대규모 CSV 데이터를 처리하기 위한 최적화된 기술을 살펴봅니다.
메모리 최적화:
메모리 문제의 핵심은 메모리 내 목록을 구성하는 데 있습니다. 대규모 데이터 세트를 저장합니다. 이 문제를 완화하기 위해 Python은 함수를 생성기 함수로 변환하는 항복 키워드를 제공합니다. 이러한 함수는 각 항복 문 후에 실행을 일시 중지하여 데이터가 발견될 때마다 증분 처리를 허용합니다.
생성기 기능을 사용하면 데이터를 행 단위로 처리할 수 있으므로 전체 파일을 메모리에 저장할 필요가 없습니다. 다음 코드는 이 접근 방식을 보여줍니다.
import csv def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) yield next(datareader) # yield header row count = 0 for row in datareader: if row[3] == criterion: yield row count += 1 elif count: # stop processing when a consecutive series of non-matching rows is encountered return
속도 향상:
또한 Python의 dropwhile 및 takewhile 기능을 활용하여 처리 속도를 더욱 향상시킬 수 있습니다. 이러한 기능을 사용하면 데이터를 효율적으로 필터링하여 관심 있는 행을 빠르게 찾을 수 있습니다. 방법은 다음과 같습니다.
from itertools import dropwhile, takewhile def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) yield next(datareader) # yield header row yield from takewhile( # yield matching rows lambda r: r[3] == criterion, dropwhile( # skip non-matching rows lambda r: r[3] != criterion, datareader)) return
간소화된 루프 처리:
생성기 기능을 결합하면 데이터세트의 루프 프로세스를 크게 단순화할 수 있습니다. getstuff 및 getdata에 최적화된 코드는 다음과 같습니다.
def getdata(filename, criteria): for criterion in criteria: for row in getstuff(filename, criterion): yield row
이제 한 행씩 스트림을 생성하는 getdata 생성기를 직접 반복하여 귀중한 메모리 리소스를 확보할 수 있습니다.
목표는 메모리 내 데이터 저장을 최소화하는 동시에 처리 효율성을 최대화하는 것임을 기억하세요. 이러한 최적화 기술을 적용하면 메모리 장애 없이 대용량 CSV 파일을 효과적으로 처리할 수 있습니다.
위 내용은 메모리 문제 없이 Python 2.7에서 대용량 CSV 파일을 효율적으로 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!