将大文件传递给 Celery 进行处理不起作用
Passing a large file to Celery for processing isn't working
我想将文件保存到 AWS S3,我正在使用 Celery,因为我不想等到函数完成写入文件。问题是当我将它发送到 Celery 函数时,我可以看到它在我的 AWS 文件存储中的大小与实际文件大小不同。
这是我将它发送到 Celery 函数的时候:
file_to_put = str(file_to_put) # because you can't send an object to celery fun
write_file_aws.delay(file_full_name, file_to_put)
Celery 函数本身:
@celery.task(name="write_file_to_aws")
def write_file_aws(file_full_name, file_to_put):
file_to_put = bytearray(file_to_put)
s3 = boto3.resource('s3')
s3.Object(BUCKET, file_full_name).put(Body=file_to_put)
return "Request sent!"
这是文件大小小于应有的大小(例如,图片中的 1kb 而不是 22kb 甚至是 710kb 而不是 230)并且文件本身只是乱码。为什么会这样?是因为我把它变成了string
吗?如果是我还能做什么?
出于正当理由(简而言之 - 任务参数存储在后端内存中,如果对象很大可能会导致内存错误)你不能将大对象传递给你的芹菜任务。相反,您将引用传递给 Celery 任务可以访问该大对象的任何地方。如果它是一个文件,那么将它放在所有 Celery 节点都可以访问的共享文件系统(例如 NFS)上,并传递文件名(如果这对您来说更容易的话,也可以传递一个路径)。
您正在序列化一个大文件并将其作为参数传递给函数。
我假设您正在使用 EC2。因此,您可以先将文件存储到 AWS EC2 的实例存储或 EBS(它们写入 S3 的速度更快)。然后将 "path" 作为 Celery 函数调用的参数传递给此文件。然后 Celery 工作人员会将文件复制到 S3。
即这个:
def write_file_aws(file_full_name, file_to_put)
将变为:
def write_file_aws(file_full_name, path_to_local_file)
这里是 AWS EC2 存储选项的入门指南:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html
我想将文件保存到 AWS S3,我正在使用 Celery,因为我不想等到函数完成写入文件。问题是当我将它发送到 Celery 函数时,我可以看到它在我的 AWS 文件存储中的大小与实际文件大小不同。
这是我将它发送到 Celery 函数的时候:
file_to_put = str(file_to_put) # because you can't send an object to celery fun
write_file_aws.delay(file_full_name, file_to_put)
Celery 函数本身:
@celery.task(name="write_file_to_aws")
def write_file_aws(file_full_name, file_to_put):
file_to_put = bytearray(file_to_put)
s3 = boto3.resource('s3')
s3.Object(BUCKET, file_full_name).put(Body=file_to_put)
return "Request sent!"
这是文件大小小于应有的大小(例如,图片中的 1kb 而不是 22kb 甚至是 710kb 而不是 230)并且文件本身只是乱码。为什么会这样?是因为我把它变成了string
吗?如果是我还能做什么?
出于正当理由(简而言之 - 任务参数存储在后端内存中,如果对象很大可能会导致内存错误)你不能将大对象传递给你的芹菜任务。相反,您将引用传递给 Celery 任务可以访问该大对象的任何地方。如果它是一个文件,那么将它放在所有 Celery 节点都可以访问的共享文件系统(例如 NFS)上,并传递文件名(如果这对您来说更容易的话,也可以传递一个路径)。
您正在序列化一个大文件并将其作为参数传递给函数。 我假设您正在使用 EC2。因此,您可以先将文件存储到 AWS EC2 的实例存储或 EBS(它们写入 S3 的速度更快)。然后将 "path" 作为 Celery 函数调用的参数传递给此文件。然后 Celery 工作人员会将文件复制到 S3。
即这个:
def write_file_aws(file_full_name, file_to_put)
将变为:
def write_file_aws(file_full_name, path_to_local_file)
这里是 AWS EC2 存储选项的入门指南:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html