我有以下代码将数据(从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
感谢任何想法。
答案 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
设置得更高,以使请求更加平行。