如何提高将数据转换为json格式的性能?

时间:2017-03-21 09:51:37

标签: python json algorithm amazon-s3

我有以下代码将数据(从postgress的行数据)转换为json。通常是IF EXISTS (SELECT 1 FROM table GROUP BY order_id, product_id HAVING "count"(*)>1;) THEN SELECT table.date, table.product_name, table.product_id, table.product_type, table.order_id, table.qty_ordered WHERE product_type = "configurable" FROM table; ELSE SELECT SELECT table.date, table.product_name, table.product_id, table.product_type, table.order_id, table.qty_ordered FROM table; END IF;

len(data) = 100 000

感谢任何想法。

1 个答案:

答案 0 :(得分:1)

您的程序中的大部分时间可能都是由等待网络的所浪费。实际上你打电话给s3.generate_presigned_url,它会向亚马逊发送请求,然后你必须等到服务器最终响应。与此同时,您无法进行太多处理。

因此,最有潜力的是通过并行执行请求来加快进程速度。因此,您发送10个请求,然后等待10个响应。 This article简要介绍了这一点。

根据您的问题和文章,您可以使用以下内容加快流程:

from multiprocessing.pool import ThreadPool

# ...

def fetch_generate_presigned_url(video_id):
    return s3.generate_presigned_url(
               ClientMethod='get_object',
               Params={
                   'Bucket': '...',
                   'Key': '{}.mp4'.format(video_id)
               }
           )

def convert_to_json(self, data):
    pool = ThreadPool(processes=10)
    urls = [row[0] for row in data]
    video_ids = pool.map(fetch_generate_presigned_url,urls)
    infos = {
        'videos':[{'id': video_id,'location': row[1],'src': row[0]}
                       for vide_id,row in zip(video_ids,data)],
        'total_count': len(data)
    }
    return json.dumps(infos)

可以将进程数process=10设置得更高,以使请求更加平行。