나는 약 60 개 정도의 거대한 (2 기가) 거대한 CSV 파일을 가지고 있는데,이 파일들은 subselection을 만들기 위해 반복하고 싶다. (각 파일에는 다양한 금융 제품, 나는 각 제품의 60 개월 시계열을 만들고 싶다).파이썬에서 가장 큰 데이터 파일을 읽는 가장 빠른 방법
전체 파일을 메모리로 읽는 것 (예 : Excel 또는 MATLAB에서 파일을로드하는 것)은 불가능합니다. 따라서 stackoverflow에서의 초기 검색을 통해 파이썬을 사용해 보았습니다. 내 전략은 각 라인을 반복적으로 반복하여 일부 폴더에 작성하는 것이 었습니다. 이 전략은 정상적으로 작동하지만 매우 느립니다.
제 생각에 메모리 사용량과 계산 속도 사이에는 트레이드 오프가 있습니다. 전체 파일을 메모리에로드하는 것이 스펙트럼의 한쪽 끝 (컴퓨터 충돌) 인 경우, 매번 한 줄을 메모리에로드하는 것은 분명히 다른 쪽 끝에 있습니다 (계산 시간은 약 5 시간).
그래서 내 주요 질문은 : * 메모리에 여러 줄을로드하는 방법이 있나요?이 과정을 (100 번?) 빠릅니다. 기능을 잃지 않는 동안? * 그렇다면 어떻게 구현할 수 있습니까? 아니면이 모든 잘못에 대해 내가 갈 건가요? 아래에서 나는 당신이하는 것을 단순화 한 코드이다. (나는 시간보다 다른 차원에서 하위 선택을하고 싶다.) 원본 데이터 파일은 의미있는 순서가 없다고 가정합니다 (매월 60 개의 파일로 분할되지 않은 것).
내가 노력하고, 특히이 방법은 다음과 같습니다 사전에
#Creates a time series per bond
import csv
import linecache
#I have a row of comma-seperated bond-identifiers 'allBonds.txt' for each month
#I have 60 large files financialData_&month&year
filedoc=[];
months=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];
years=['08','09','10','11','12'];
bonds=[];
for j in range(0,5):
for i in range(0,12):
filedoc.append('financialData_' +str(months[i]) + str(years[j])+ '.txt')
for x in range (0,60):
line = linecache.getline('allBonds.txt', x)
bonds=line.split(','); #generate the identifiers for this particular month
with open(filedoc[x]) as text_file:
for line in text_file:
temp=line.split(';');
if temp[2] in bonds: : #checks if the bond of this iteration is among those we search for
output_file =open('monthOutput'+str(temp[2])+ str(filedoc[x]) +'.txt', 'a')
datawriter = csv.writer(output_file,dialect='excel',delimiter='^', quoting=csv.QUOTE_MINIMAL)
datawriter.writerow(temp)
output_file.close()
감사합니다.
p.s. 단지 코드가 작동하는지 확인하십시오 (모든 제안은 물론 환영하지만).하지만 문제는 속도입니다.
내 전략은 SQL 데이터베이스 (MySQL, PostgreSQL, 당신이 편한 곳)에로드하고 거기서 번호를 처리하는 것입니다. –
@ 바트 프리드리히 (Friedrichs) – sobek
@sobek 아마, 나는 redis를 모른다. 요점은 직접하지 말고 큰 데이터 집합을 쉽게 처리 할 수있는 일반 저장소를 사용하는 것입니다. 필자는 SQL을 가장 잘 알고 있기 때문에 SQL을 추천했습니다. –