2016-11-15 12 views
0

Я пытаюсь загрузить файлы ~ 3k (по 1 килобайт каждый) в boto с помощью GreenPool.boto - slow set_content_from_file, когда get_bucket validate is False

Мой вопрос:

Почему get_bucket() вызов занимает так много времени на вызов, что вызывает компромисс с set_content() времени? и как я могу обойти это. Благодаря!

Подробнее:

  • get_bucket(validate=True) занимает 30 секунд, в среднем, и следующий set_content_from_file_name занимает менее 1 сек.

  • Я попытался изменить к validate=False, это удалось сократить get_bucket() время менее 1 сек, но тогда время для set_content_from_file_name подскочила до ~ 30 секунд. Я не мог найти причину этого компромисса в boto docs. не

Код:

def upload(bucket_str, key_str, file_path): 

    # new s3 connection 
    s3 = boto.connect_s3() 

    # get bucket 
    bucket_time = time.time() 
    b = s3.get_bucket (bucket_name, validate=True) 
    logging.info('get_bucket Took %f seconds'%(time.time()-bucket_time)) 

    # get key 
    key_time = time.time() 
    key = mapping_bucket.new_key(key_str) 
    logging.info('new_key Took %f seconds'%(time.time()-key_time)) 

    for i in range(S3_TRIES): 
     try: 
      up_time = time.time() 
      key.set_contents_from_filename (file_path, 
      headers={ 
       "Content-Encoding": "gzip", 
       "Content-Type": "application/json", 
      }, 
      policy='public-read') 
      logging.info('set_content Took %f seconds'%(time.time()-up_time)) 
      key.set_acl('public-read') 
      return True 

     except Exception as e: 
      logging.info('try_set_content exception iteration - %d, %s'%(i, str(e))) 
      _e = e 

    raise _e 

ответ

1

вы можете проверить документ для get_bucket

If validate=False пройдена, никакой запрос не выполнен на службу (не заряда задержки/связи). Это безопасно делать, если вы уверены, что ведро существует.

Если передан по умолчанию validate=True, выполняется запрос к услуге , чтобы обеспечить наличие ведра. До Boto v2.25.0 этот отобрал список ключей (но с максимальным пределом, установленным на 0, всегда , возвращающим пустой список) в ковше (& включил лучшую ошибку сообщений), с увеличенным расходом. Начиная с версии Boto v2.25.0, теперь выполняет запрос HEAD (менее дорогие, но хуже сообщения об ошибках).

После этого, когда вы вызываете set_contents_from_filename, ему необходимо открыть ключ s3 для чтения, поэтому в это время он отправит запрос на s3.

Как Возвращаясь к вопросу о загрузке большого количества файлов, а так как вы помечать вопросы с boto3, я хотел бы предложить вам перейти на boto3 и посмотреть на Transfer Manager