Tengo el siguiente código para convertir datos (datos de fila de postgress) a json. Usualmente 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)Gracias por cualquier idea.
La mayor parte del tiempo en su programa probablemente se desperdicia esperando a la red. De hecho, llama a s3.generate_presigned_url , que enviará una solicitud a Amazon y luego tendrá que esperar hasta que el servidor finalmente responda. Mientras tanto, no hay mucho procesamiento que pueda hacer.
Entonces, el mayor potencial es acelerar el proceso haciendo solicitudes en paralelo . Entonces, envía, por ejemplo, 10 solicitudes y luego espera las 10 respuestas. Este artículo ofrece una breve introducción al respecto.
Según su pregunta y el artículo, puede usar algo como lo siguiente para acelerar el proceso:
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) El número de procesos, process=10 se puede establecer más alto para que las solicitudes sean más paralelas.