2015-06-22 54 views
2

我通過其批量請求通過其google-api-python-client與Google API進行通信。在間歇的請求有侷限性:Python:通過鏈接大小將字符串列表拆分爲更小的塊的高效方法

  • 批處理請求不能包含多於1000個請求,
  • 批處理請求不能包含超過1MB在有效載荷中。

我有一個隨機數的隨機長度字符串在列表中,從中我需要構建一個批處理請求,同時記住上述限制。

有誰知道有效構建可以提交給Google API的原始列表塊的好方法嗎?我的意思是「有效」,而不是遍歷第一部分的所有元素(計算有效載荷大小)。

到目前爲止,這正是我想到的:最多1000件物品,構建請求,查看有效負載大小。如果它大於1M,則取500,看尺寸。如果有效載荷較大,則取前250項。如果有效載荷較小,則需要750件物品。等等,你會得到邏輯。通過這種方式,可以在迭代次數較少的情況下獲得適當數量的元素,而不是在每次添加後檢查它時構建有效負載。

我真的不想重新發明輪子,所以如果有人知道一個高效的內置/模塊,請讓我知道。

當您向已實例化的BatchHttpRequest添加了正確數量的請求時,可以通過調用_serialize_request來計算主體有效負載大小。

另請參閱Python API Client Library documentation進行批處理請求。

+0

請求如何計算有效負載大小? –

+0

您可能想閱讀[問]。 – boardrider

+0

@JohnLaRooy我已將它添加到問題中。 – karolyi

回答

0

好吧,看來我創建的東西,解決了這個問題,這裏的想法在python草案:

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import random 
import string 
import sys 

MAX_LENGTH = 20 
MAX_SIZE = 11111 


def get_random(): 
    return ''.join([ 
     random.choice(string.ascii_letters) for i in range(
      random.randrange(10, 1000))]) 


def get_random_list(): 
    return [get_random() for i in range(random.randrange(50, 1000))] 


def get_str_length(rnd_list, item_idx): 
    return len(''.join(rnd_list[:item_idx])) 

rnd_list = get_random_list() 


def calculate_ideal_amount(rnd_list): 
    list_bounds = { 
     'first': 1, 
     'last': len(rnd_list) 
    } 
    print ('ORIG_SIZE: %s, ORIG_LEN: %s' % (
     get_str_length(rnd_list, len(rnd_list)), len(rnd_list))) 
    if get_str_length(rnd_list, list_bounds['first']) > MAX_SIZE: 
     return 0 
    if get_str_length(rnd_list, list_bounds['last']) <= MAX_SIZE and \ 
      list_bounds['last'] <= MAX_LENGTH: 
     return list_bounds['last'] 
    while True: 
     difference = round((list_bounds['last'] - list_bounds['first'])/2) 
     middle_item_idx = list_bounds['first'] + difference 
     str_len = get_str_length(
      rnd_list, middle_item_idx) 
     print(
      'MAX_SIZE: %s, list_bounds: %s, ' 
      'middle_item_idx: %s, diff: %s, str_len: %s,' % (
       MAX_SIZE, list_bounds, middle_item_idx, difference, str_len)) 
     # sys.stdin.readline() 
     if str_len > MAX_SIZE: 
      list_bounds['last'] = middle_item_idx 
      continue 
     if middle_item_idx > MAX_LENGTH: 
      return MAX_LENGTH 
     list_bounds['first'] = middle_item_idx 
     if difference == 0: 
      if get_str_length(rnd_list, list_bounds['last']) <= MAX_SIZE: 
       if list_bounds['last'] > MAX_LENGTH: 
        return MAX_LENGTH 
       return list_bounds['last'] 
      return list_bounds['first'] 

ideal_idx = calculate_ideal_amount(rnd_list) 

print (
    len(rnd_list), get_str_length(rnd_list, len(rnd_list)), 
    get_str_length(rnd_list, ideal_idx), ideal_idx, 
    get_str_length(rnd_list, ideal_idx + 1)) 

此代碼完全相同的我試圖描述,通過查找和修改的範圍該列表在測量其返回的(連接的)大小的同時返回列表的索引,然後返回應該切片的列表的索引以實現最有效的字符串大小。這種方法避免了逐個編譯和測量列表的CPU開銷。運行此代碼將顯示它在列表中執行的迭代。

get_str_length,列表和其他函數可以替換爲使用API​​客戶端中的相應功能,但這是背後的粗略想法。

但是,代碼不是萬無一失的,解決方案應該是沿着這些路線的東西。

+0

我從來沒有理解爲什麼人們喜歡採用爲可讀性設計的語言,並將其轉化爲混淆的PHP。我希望下面的代碼對你有意義。 – msw

+0

歡迎您發佈更優雅的解決方案。 – karolyi

相關問題