2015-01-05 3 views
0

많은 사람들에게 중복 된 질문처럼 보일 수 있지만 만족스러운 답변을 찾을 수 없습니다.팬더 확장형 데이터 구조 - 메모리 사용량 최소화

나는 200ms마다 최악의 경우 데이터를 추가 할 TimeSeries 데이터 개체가 있습니다. 이제는 기본 데이터 구조를 다시 만들어야한다는 것을 이해하고 매우 오래된 메모리를 무겁게 처리합니다. 이전 개체를 정리하지 않는 것 같습니다. 나는 어떤 차이를 전혀하지 않았다

old = mydata 
mydata = mydata.append(...) 
del old 

같은 것을 시도!

문제는 내 프로세스가 1GB 메모리 만있는 호스트에서 작동하고 이러한 종류의 처리가 발생한다는 것입니다. 호스트 메모리가 빨리 소모됩니다.

분석은 매일 200 밀리마다 수행되므로 최소한 30 시간 분량의 데이터를 메모리에 보관해야합니다.

메모리를 최적화하고 팬더 TIME 시리즈 기능 (시간 간격을 기준으로 슬라이스)을 유지하는 방법에 대한 제안.

+0

글쎄'append'는 'concat'의 래퍼입니다. 따라서'concat'을 사용하여 구현을 사용할 수 있다면 조금 더 빨라야합니다. –

+0

나는 스피드가 아니라 메모리 소비에 대해 너무 걱정하지 않는다. – ren

답변

0

append 작업을 수행하면 새로운 시리즈가 반환됩니다. 따라서 매번 데이터를 복사하는 것은 속도와 메모리 측면에서 비효율적입니다. 이것을 처리하는 일반적인 방법은 필요한 것보다 큰 크기를 미리 작성한 다음 단순히 값을 채우는 것입니다. 필요한 경우 주기적으로 크기를 조정하십시오. (이것은 파이썬리스트/dict에서도 마찬가지입니다.)

예를 들면 here을주고,이를 수행하는 방법은 HDFStore입니다.

In [7]: df = DataFrame(index=range(5),columns=list('AB')) 

In [8]: df.iloc[0] = Series(dict(A = 10, B = 5)) 

In [9]: df.iloc[1] = Series(dict(A = 11, B = 6)) 

In [10]: def f(x,indexer): 
    ....:  return x.iloc[0:indexer]*2 
    ....: 

In [11]: f(df,2) 
Out[11]: 
    A B 
0 20 10 
1 22 12 

In [12]: df.iloc[2] = Series(dict(A = 12, B = 7)) 

In [13]: f(df,3) 
Out[13]: 
    A B 
0 20 10 
1 22 12 
2 24 14 
+0

이것은 훌륭하지만, pandas.TimeSeries 데이터 유형에 의해 제공되는 datetime 슬라이싱 기능이 필요합니다. myTs [datetime1 : datetime2] – ren

+0

이렇게 DatetimeIndex를 추가하십시오. ''.iloc''은 인덱스를 설정하는 위치 인덱서이지만, 원하는대로 슬라이스 할 수 있습니다. – Jeff

+0

나는 확실히 그것을 시도 할 것이지만, 유일한 문제는 그들이 들어 오기 전에 인덱스를 모른다는 것입니다! 내 인덱스는 타임 스탬프이므로 도착하기 전에는 알 수 없으므로 DataFrame 객체에 추가해야합니다. 이로 인해 TimeSeries 데이터 형식과 비슷한 동작이 발생합니까? – ren