2016-09-14 2 views
2

Python GAE 응용 프로그램에서 다음 코드 조각은 프로덕션 환경에서보다 느리게 실행됩니다. 처리는 다음과 같이 진행됩니다.GAE Python 코드 로컬에서보다 생산 속도가 약간 느림

  1. 약 1MB의 텍스트 파일이 POST에로드됩니다. 텍스트 파일의 각 행은 "항목"입니다.
  2. 내 코드는 텍스트 파일에서 항목 목록을 만들고 (컴파일 된 RE와 비교하여) 중복 및 유효성을 검사합니다. 여기

코드입니다 :이 지역 dev에 서버에서 실행하면

def process_items(self, text): 
    item_list = text.split() 
    item_set = set() 
    n_valid = 0 
    n_invalid = 0 
    n_dups = 0 
    out = "" 
    for item in item_list: 
     if item in item_set: 
      n_dups += 1 
      out += "DUPLICATE: %s\n" % item 
     elif valid_item(item): # This compares against a compiled RE 
      item_set.add(item) 
      n_valid += 1 
      out += "%s\n" % item 
     else: 
      n_invalid += 1 
      out += "INVALID: %s\n" % item 
    return out 

, 50,000 라인의 1MB의 파일을 처리하는 데 5 초 걸립니다.

프로덕션 환경에서이 파일을 실행하면 동일한 파일이 1 분 이상 소요되고 요청 시간이 초과됩니다. 파일 업로드에는 약 1 초 정도 걸리므로 병목 목이 위의 코드라는 것을 알고 있습니다.

이전에는 프로덕션 코드가 로컬 코드와 거의 동일한 속도였습니다. 나는이 코드가 변경된 것으로 생각하지 않기 때문에 Google 측에서 변경되었을 수도 있습니다.

이 코드가 제작 속도가 왜 느려지는지 알고 싶습니다. 이 코드를 더 빨리 만들 수있는 방법은 없습니까? 중복 된 행과 유효하지 않은 행을 나타내는 주석이 달린 파일을 사용자에게 반환해야합니다.

는 편집 : mgilson의 의견에 대응

, 나는 다음 코드를 시도하고, 그것을 실행 시간에 큰 차이를 만들어! 이전에 1 분 후에 시간 초과 된 처리에는 이제 약 5 초 밖에 걸리지 않습니다. GAE는 여전히 예상보다 느리다 (상대적으로 느린 서버 CPU를 차지한다). 그러나 개선 된 알고리즘으로는 지금은 중요하지 않다.

def process_items(self, text): 
    item_list = text.split() 
    item_set = set() 
    n_valid = 0 
    n_invalid = 0 
    n_dups = 0 
    for i, item in enumerate(item_list): 
     item = item.strip() 
     if item in item_set: 
      n_dups += 1 
      item_list[i] = "DUPLICATE: %s" % item 
     elif valid_item(item): # This compares against a compiled RE 
      item_set.add(item) 
      n_valid += 1 
      item_list[i] = item 
     else: 
      n_invalid += 1 
      item_list[i] = "INVALID: %s" % item 
    return "\n".join(item_list) 
+4

지역 실행 비교 :

하나는 일을 단축하기 위해 할 수있는 일이 목록에서 결과를 축적 (또는 발전기에서 그들을 얻을 수) 전체 결과를 얻을 수 str.join를 사용해서하는 것입니다 그리고 GAE에서 달리기는 정말 공정하지 않습니다. 설정 한 [인스턴스 클래스] (https://cloud.google.com/appengine/docs/about-the-standard-environment#instance_classes)에 따라 CPU 제한이 600MHz로 낮을 수 있습니다. 대부분의 개인 컴퓨터는 현재보다 훨씬 빠릅니다. _might_ 도움이되는 즉각적인 최적화는 결과를리스트에 축적하고'+ ='를 사용하는 대신 끝에 "return" ".join (results)'을 끝내는 것입니다. 파이썬에서 [+]보다 더 빨리 ''.join()이 나타나는 이유를 보시라. (0120-13992-03) # – mgilson

+0

'process_items'가 한 줄을 생성하는'generate_items ' 느린'+ =' –

+0

@ mgilson을 없앰으로써 전체 처리 시간을 단축 할 수 있습니다. My Mac은 2.2GHz이므로 GAE보다 3.7 배 빠릅니다. 이 Python 코드의 경우 Mac은 GAE보다 12 배 이상 빠릅니다. 그것은 많은 요소가 불완전한 비교가된다는 것을 깨닫지 만, 여전히 큰 불일치처럼 보입니다. –

답변

4

그것은에서 GAE 생산은 지역적으로보다 느리게 실행하는 것이 모두 예상치 못한 아니에요 - 당신의 instance class, 생산 CPU에 따라 대부분의 개발자 컴퓨터보다 훨씬 느린 600MHz의 낮은 스로틀 할 수 있습니다.

def process_items(self, text): 
    item_list = text.split() 
    item_set = set() 
    n_valid = 0 
    n_invalid = 0 
    n_dups = 0 
    out = [] 
    for item in item_list: 
     if item in item_set: 
      n_dups += 1 
      out.append("DUPLICATE: %s\n" % item) 
     elif valid_item(item): # This compares against a compiled RE 
      item_set.add(item) 
      n_valid += 1 
      out.append("%s\n" % item) 
     else: 
      n_invalid += 1 
      out.append("INVALID: %s\n" % item) 
    return "".join(out)