2017-02-14 4 views
0
class FindHits(object): 

    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def calculate_hits(): 
     # Some expensive calculation using arguments self.a, and self.b 
     df = pd.DataFrame() 
     return df 

몇 가지 히트를 계산하는 클래스가 있습니다. 계산 및 데이터 검색 프로세스는 다소 비쌉니다. 따라서 주어진 매개 변수 집합에 대해 "calculate_hits"의 결과를 유지하려고합니다. 이 결과를 나중에 다시 필요로 할 때 계산 및 검색을 다시하지 않아도되도록하고 싶습니다.피라미드 프레임 워크 내의 요청간에 팬더 DataFrame (값 비싼 계산)을 캐시/메모하려면 어떻게합니까?

Naively, 출력 결과를 피라미드 프레임 워크 내의 세션 개체에 넣으려고했습니다. 팬더 데이터 프레임이 너무 크기 때문에 작동하지 않습니다 ... (다른 문제도있을 수 있습니다).

어떻게하면 되나요?

[추가 컨텍스트 : 팬더 데이터 프레임에서 일부 값을 계산 중입니다. 그런 다음 jquery DataTable에 전체 테이블을 표시합니다. 프론트 엔드를 사용하여 선택한 행을 찾습니다. 선택한 행 목록을 다시 보냅니다. 이제 Dataframe의 해당 행으로 이동하여 해당 데이터 프레임의 정보를 받아 데이터베이스에 저장하려고합니다.

답변

1

요청간에 공유 할 수있는 일종의 동기화 된 데이터 저장소를 정의해야합니다. 이것이 외부의 것이 아니라면 (redis, memcache, rdbms, ...) 아마도 잠금이있는 in-memory store에 대해 물어볼 것입니다. 이러한 상점을 registry에 연결하고 각 요청에서 액세스 할 수 있습니다. 여기에 스레딩 문제를 인식하고 2 개 이상의 요청이 한 번에 저장소를 업데이트하지 않도록 저장소를 적절히 잠그는 것은 사용자의 책임입니다. 팬더의 데이터 프레임이 스레드 안전하지만 그렇지 않을 내기 원하는 경우

def main(...): 
    config.registry.mystore = {'frame': pd.DataFrame()} 

def view(request): 
    frame = request.registry.mystore['frame'] 

는 보조 노트로서, 나는 아무 생각이 없다, 그래서 당신은 더에 직렬화가 어떻게 든 해결해야합니다 원시 형식으로 변환 한 다음 요청 당 새 데이터 프레임으로 비 직렬화합니다.