相关疑难解决方法(0)

CPython内存分配

这篇文章的灵感来自于关于如何在CPython中为对象分配内存的评论.原来,这是创建一个列表,并追加到它在一个for循环的环境相一相的列表理解.

所以这是我的问题:

  1. CPython中有多少个不同的分配器?
    • 每个人的功能是什么?
  2. 什么时候被malloc称为?(malloc根据本评论中的内容,列表理解可能不会导致调用
  3. python在启动时为自己分配了多少内存?
    1. 是否有规则管理哪些数据结构在此内存中获得第一个"dibs"?
  4. 对象在被删除时使用的内存会发生什么变化(python仍然保留在内存中以便将来分配给另一个对象,或者GC是否为另一个进程释放内存,比如Google Chrome,要使用) ?
  5. 何时触发GC?
  6. lists是动态数组,这意味着它们需要一块连续的内存.这意味着如果我尝试将对象附加到列表中,其底层C数据结构数组无法扩展,则将数组复制到内存的不同部分,其中可以使用更大的连续块.那么当我初始化列表时,为这个数组分配了多少空间?
    • 为新数组分配了多少额外空间,现在它包含旧列表和附加对象?

编辑:从评论中,我认为这里有太多问题.我这样做只是因为这些问题都非常相关.不过,如果是这样的话,我很乐意把它分成几个帖子(请在评论中告诉我这样做)

python memory-management cpython

15
推荐指数
1
解决办法
2080
查看次数

芹菜不释放记忆

看起来芹菜在任务完成后不释放内存.每次任务完成时,都会有5m-10m的内存泄漏.因此,随着成千上万的任务,很快就会耗尽所有内存.

BROKER_URL = 'amqp://user@localhost:5672/vhost'
# CELERY_RESULT_BACKEND = 'amqp://user@localhost:5672/vhost'

CELERY_IMPORTS = (
    'tasks.tasks',
)

CELERY_IGNORE_RESULT = True
CELERY_DISABLE_RATE_LIMITS = True
# CELERY_ACKS_LATE = True
CELERY_TASK_RESULT_EXPIRES = 3600
# maximum time for a task to execute
CELERYD_TASK_TIME_LIMIT = 600
CELERY_DEFAULT_ROUTING_KEY = "default"
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = "default"
CELERY_DEFAULT_EXCHANGE_TYPE = "direct"
# CELERYD_MAX_TASKS_PER_CHILD = 50
CELERY_DISABLE_RATE_LIMITS = True
CELERYD_CONCURRENCY = 2
Run Code Online (Sandbox Code Playgroud)

可能与问题相同,但它没有答案: RabbitMQ/Celery/Django内存泄漏?

我没有使用django,我的包是:

Chameleon==2.11
Fabric==1.6.0
Mako==0.8.0
MarkupSafe==0.15
MySQL-python==1.2.4
Paste==1.7.5.1
PasteDeploy==1.5.0
SQLAlchemy==0.8.1
WebOb==1.2.3
altgraph==0.10.2
amqp==1.0.11
anyjson==0.3.3
argparse==1.2.1
billiard==2.7.3.28
biplist==0.5
celery==3.0.19
chaussette==0.9
distribute==0.6.34 …
Run Code Online (Sandbox Code Playgroud)

python amqp rabbitmq celery

12
推荐指数
3
解决办法
1万
查看次数

Django 1.6和Celery 3.0内存泄漏

将Django升级到1.6后,我的芹菜工人正在吃掉RAM.似乎为工作人员分配的内存不会在每项任务之后释放并增长.

相关设置:

# DB:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'somedb',
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}


# CELERY SETTINGS:
CELERY_RESULT_BACKEND = 'redis://'
BROKER_URL = 'redis://'
Run Code Online (Sandbox Code Playgroud)

相关软件包版本:

Django==1.6
celery==3.0.24
django-celery==3.0.23
billiard==2.7.3.34
kombu==2.5.16
redis==2.7.6
Run Code Online (Sandbox Code Playgroud)

发生在我的本地env(with DEBUG=False)手动运行worker以及芹菜与Upstart一起运行的暂存环境中.


更新:

  1. 尝试设置autocommit=False没有成功.
  2. 可能是它与Django版本升级无关,但是对于某些设置或第三方软件包,我必须升级才能切换到1.6.

python django celery django-celery django-1.6

6
推荐指数
1
解决办法
1631
查看次数