2014-02-09 2 views
1

for 루프를 사용하여 각각 약 1GB의 tsv 파일을 팬더 시리즈에로드합니다. 그들은 항상 같은 변수에 할당 된 다음 Series.add()를 사용하여 시리즈의 총 숫자가 포함 된 시리즈에 추가합니다.Python pandas 시리즈에 재 할당 : 가비지 콜렉션

업데이트 : 모든 tsv는 더 많거나 적은 동일한 색인을 가지고 있으므로 전체 시리즈의 길이는 실제로 합산 된 값만 변경하지 않습니다.

"오래된"시리즈가 가끔 해제되어 메모리 사용량이 제한 범위 내에 머물러 있기를 기대합니다. 그러나 메모리 사용량은 컴퓨터의 62GB 메모리가 모두 소모 될 때까지 증가합니다.

누구든지 아이디어를 어떻게 해결할 수 있습니까? 루프 내에서 명시 적으로 변수를 삭제하려고 시도하고 루프에서 gc.collect()를 호출하려고했습니다. 둘 다 도움이되지 못했습니다. 파이썬 2.73을 사용하고 있습니다.

더 상세 다음 TSV에

처음 두 열 인덱스 (염색체 위치)와 제 3 컬럼 된 파일은 정수이다.

코드는 다음과 같습니다

total = pd.read_csv(coverage_file1,sep='\t',index_col=[0,1],header=None,names= ['depth'],squeeze=True) 

for file in coverage_files: 
    series = pd.read_csv(file,sep='\t',index_col=[0,1],header=None,names=['depth'],squeeze=True) 
    total = total.add(series,fill_value=0).astype(int) 
    del series # I tried with and without this and the next line 
    gc.collect() 


total.to_csv(args.out,sep='\t',header=None) 
+1

squeeze를 사용하는 것이 버그 일 수 있습니다. 그것을하지 않고 (그리고 시리즈를 얻을 하위 집합); 그것이 다른 경우 pls는 github에 버그 보고서를 제출합니다 – Jeff

+0

@Jeff, 같은 문제가 발생하지 않습니다. – feilchenfeldt

답변

0

그러나 당신은 여전히 ​​total 데이터를 축적, series되는 쓰레기 수집있다. 어쩌면 알고리즘을 최적화할까요? 그것은 나에게 당신이 단지 같은 형식의 파일에 합류하기를 원한다고 생각하기 때문에 판다를 사용할 필요가 없다.

+0

안녕하세요. 아니요, 실제로 총 데이터가 누적되지 않습니다. 나는 파일에 합류하지 않고 시리즈 객체의 합을 계산한다. 합계는 항상 같은 길이의 일련으로 유지되며 값만 증가하지만 지나치게 증가하지는 않습니다. – feilchenfeldt

+1

판다의 어떤 버전을 사용하십니까? 내 시스템에서 스크립트를 검사했고 메모리 사용에 문제가 없었습니다 (python2 + pandas 0.13.0). 또한 루프에 대한 실행 횟수를 확인 했습니까? 데이터를 저장하는 데 약간의 오버 헤드가있을 수 있으므로 1 시리즈를로드하기에 충분한 메모리가 없을 수 있습니다. – rsk

+0

제안 해 주셔서 감사합니다. 팬더 0.12.0을 사용하고 있습니다. 나는 62Gb를 사용할 수 있으며 각 파일은 1GB이다. for 루프는 최소한 여러 번 실행됩니다. 난 단지 5 파일과 노력하고 그것을 작동하지만, 160 파일 (내가 원하는대로) 충돌합니다. – feilchenfeldt