2014-07-25 1 views
0

분산 된 파일 시스템을 awoto simpledb로 boto를 사용하여 이동하는 과정에 있으며 명확한 해결책이없는 문제가 있습니다. 메모리 크기에 기초하여 파이썬으로 사전 분할하기

def insert(documents): 
    data = {hash_doc(d): _decode(d) for d in documents if hash_doc(d)} 
    domain.batch_put_attributes(data) 

은 기본적으로 내가 타격하고있어 문제가 batch_put_attributes 기능에 만든 AWS까지 요청이 1메가바이트의 최대 크기를 가지고 있다는 것입니다 다음과 같이 내 코드의 현재 상태입니다. 분명히 내가 만들고있는 요청 수를 최소화하고 싶지만 1MB 제한을 넘을 수는 없습니다.

는 기본적으로 내가 조금 느낄 수

모든 특정 메모리 크기 이하 덩어리, 그러나 적은 덩어리로

분할이 반복 가능한 말을 어떤 좋은 파이썬 방법이 더 많은 코드를 포함하지 않는 것이 좋지 않지만,이 코드에서는 다루기 힘든 것을 발견하지 못했고, 꽤 간단한 솔루션이 있어야한다고 생각합니다.

+0

나는 곧은 해결책을 생각할 수 없습니다. 그러나 sys.getsizeof (VAR_NAME)를 가지고 놀아 보려고 시도 했나요? –

답변

0

아마 전처리에 다음과 같은 일을 할 그것을 조금 :

size_d = defaultdict(list) 
for k,v in data.items(): 
    size_d[sys.getsizeof(v)].append(v) 

그럼 그냥 그렇게 그렇지 보내 결정 항목을 팝업, 항목의 1메가바이트 버킷을 채우기 위해 기능을 그것을 재사용하십시오. 크기별로 항목을 정렬하여 조금만 최적화 할 수 있습니다. 확실히 이것이 knapsack problem인지 확인하십시오. 최적의 해결책을 찾으면 알려주세요.

+0

배낭 문제는 아닙니다.이 대답은 질문에 대한 오해입니다. 여기에는 각 요청의 항목이 순차적으로 나타나야한다는 제약 조건이 있습니다. 적응성이면서도 순차적 인 목록 청킹 (chunking)이 아니라 배낭 문제입니다. –

+0

제 잘못입니다. 순차적 인 측면을 잘못 이해했습니다. 시퀀스 제한이 특정 문제에 해당하며 idx 105 이전에 idx 200에 항목을 업로드하지 않도록 청크를 업로드해야한다는 의미입니까? – BWStearns

+0

그것은 맞는 말입니다. –