【问题标题】:How to pass large chunk of data to celery如何将大量数据传递给芹菜
【发布时间】:2017-06-16 19:47:36
【问题描述】:

我正在使用 celery worker 从我的机器学习模型中获取结果。

我正在做的是将大型 numpy 数组(几兆字节)从客户端发送到 celery 任务并返回。

目前我在客户端 numpy 数组中序列化为 base64。当我在客户端或 celery worker 上直接从/向 Redis 存储/获取数据时,系统的性能比我让 celery 执行所有参数传递(numpy 的 base64)时快得多。

我也想使用 celery(带有“redis”代理)来传递 args/numpy 数组,而不是直接在客户端中使用 redis。你知道哪里有问题吗?我如何设置芹菜的配置以更有效地做到这一点(在客户端->经纪人->工人之间传递数据并返回给客户端)。

        serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
        serialized = base64.b64encode(serialized)
        #self.redis.set(key, serialized)

        print('calling celery processor')
        result = self.celery.send_task('process', args=[number_of_records, serialized], kwargs={})
        returncode, result = result.get(timeout=1000, interval=0.1) 

vs(这个更快,直接使用redis存储):

        serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
        serialized = base64.b64encode(serialized)
        self.redis.set(key, serialized)

        print('calling celery processor')
        result = self.celery.send_task('process', args=[number_of_records, key], kwargs={})
        returncode, result = result.get(timeout=1000, interval=0.1) 

        resultc= self.redis.get(key)

关于 celery 的序列化、配置设置等性能的任何提示?我希望这个系统快速而简单。我真的应该像第二个例子那样直接使用redis吗?

【问题讨论】:

  • 这个问题你解决了吗?

标签: python numpy serialization redis celery


【解决方案1】:

Celery 使用 JSON 或 cPickle 来序列化消息。所以可能发生的情况是您要序列化两次 - 首先是 base64(效率低下),然后是 JSON 或 cPickle。

您是否尝试过完全跳过 base64 编码并让 Celery 处理它?

您可以通过以下代码告诉 Celery 使用 cPickle(更高效)而不是 JSON(默认):

app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2010-11-05
    • 2017-07-31
    • 1970-01-01
    • 2020-12-14
    • 2018-04-06
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多