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

2024-10-06 18:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码将数据(postgress中的行数据)转换为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)

谢谢你的建议。你知道吗


Tags: 数据代码selfidjsonurldatadictionary
1条回答
网友
1楼 · 发布于 2024-10-06 18:21:32

程序中的大部分时间可能都浪费在等待网络上。实际上,您需要调用s3.generate_presigned_url,它将向Amazon发送一个请求,然后您必须等待服务器最终响应。在此期间,没有什么处理你可以做。你知道吗

因此,最有可能的是通过并行处理请求来加快进程。例如,您发送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可以设置得更高,以使请求更并行。你知道吗

相关问题 更多 >