代码之家  ›  专栏  ›  技术社区  ›  Milad Khodabandehloo

django shell、django rest framework序列化程序和cassandra中的内存泄漏

  •  0
  • Milad Khodabandehloo  · 技术社区  · 6 年前

    我有一个像这样的django cassandra模型:

    class Milad(DjangoCassandraModel):
    name = columns.Text(primary_key=True)
    bulkid = columns.BigInt(primary_key=True)
    f1 = columns.UUID()
    f2 = columns.UUID()
    f3 = columns.UUID()
    f4 = columns.UUID()
    f5 = columns.UUID()
    f6 = columns.UUID()
    f7 = columns.UUID()
    f8 = columns.UUID()
    f9 = columns.UUID()
    f10 = columns.UUID()
    
    class Meta:
        get_pk_field = "bulkid"
    

    和以下序列化程序:

    from rest_framework import serializers
    
    class BulkidSerializer(serializers.Serializer):
        bulkid = serializers.IntegerField()
    
        def to_representation(self, instance):
            return instance.bulkid
    

    我的表中有220200条记录。 当我用命令打开django shell时 python3 manage.py shell a执行以下操作我的内存使用率从8.8GB变为10.8GB。

    操作:

    records = Milad.objects.all().limit(None)
    data = BulkidSerializer(records, many=True).data
    

    手术后当我使用 sys.getsizeof(data) 对象的大小约为2MB,但在没有运行任何操作时,我的内存仍为10.8,并且在关闭外壳之前,内存中没有该大小的数据。 有什么问题吗?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Adam Holmberg    5 年前

    在内存中具体化所有结果将导致内存使用激增。Python运行时扩展内存而不立即将其返回操作系统的情况并不少见。除非您遇到资源限制,否则这不应该引起关注。

    如果要避免在内存中具体化所有结果,应该使用驱动程序提供的分页。

    By token with cqlengine

    Paging in driver