我有以下代码将数据(来自 postgres 的行数据)转换为 json。通常 len(data) = 100 000
def convert_to_json(self, data):
s3 = self.session.client('s3')
infos = {
'videos':[],
'total_count': len(data)
}
for row in data:
video_id = row[0]
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': '...',
'Key': '{}.mp4'.format(video_id)
}
)
dictionary = {
'id': video_id,
'location': row[1],
'src': url
}
infos['videos'].append(dictionary)
return json.dumps(infos)
感谢您的任何想法。
最佳答案
您程序中的大部分时间可能都浪费在了等待网络上。实际上,您调用了 s3.generate_presigned_url
,它会向 Amazon 发送请求,然后您必须等待服务器最终响应。与此同时,您无能为力。
因此,最有潜力的方法是通过并行执行请求 来加快处理速度。例如,您发送 10 个请求,然后等待 10 个响应。 This article对此作一简要介绍。
根据您的问题和文章,您可以使用类似以下的方法来加快该过程:
<b>from multiprocessing.pool import ThreadPool</b>
# ...
def <b>fetch_generate_presigned_url(video_id)</b>:
return s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': '...',
'Key': '{}.mp4'.format(<b>video_id</b>)
}
)
def convert_to_json(self, data):
pool = ThreadPool(processes=10)
urls = <b>[row[0] for row in data]</b>
video_ids = pool.map(<b>fetch_generate_presigned_url</b>,urls)
infos = {
'videos':[{'id': video_id,'location': row[1],'src': row[0]}
<b> for vide_id,row in zip(video_ids,data)</b>],
'total_count': len(data)
}
return json.dumps(infos)
进程的数量,process=10
可以设置的更高,让请求更并行。
关于python - 如何提高数据转json格式的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42923514/