2016-06-18 3 views
0

나는 약 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. 단지 코드가 작동하는지 확인하십시오 (모든 제안은 물론 환영하지만).하지만 문제는 속도입니다.

+2

내 전략은 SQL 데이터베이스 (MySQL, PostgreSQL, 당신이 편한 곳)에로드하고 거기서 번호를 처리하는 것입니다. –

+0

@ 바트 프리드리히 (Friedrichs) – sobek

+0

@sobek 아마, 나는 redis를 모른다. 요점은 직접하지 말고 큰 데이터 집합을 쉽게 처리 할 수있는 일반 저장소를 사용하는 것입니다. 필자는 SQL을 가장 잘 알고 있기 때문에 SQL을 추천했습니다. –

답변

0

https://softwarerecs.stackexchange.com/questions/7463/fastest-python-library-to-read-a-csv-file에 언급 된 pandas.read_csv을 테스트 할 것입니다. 청크로 파일 읽기를 지원합니다 (iterator=True 옵션)

조건이 자주 일치하면 코드의 일부가 심각한 성능 문제를 일으킬 수 있다고 생각합니다.

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() 

내부 루프 파일을 닫은 후 cvs.writer() 객체를 생성하고, 파일을 열지 않도록하기 좋을 것이다.

관련 문제