Django DRF не освобождает память после отправки больших данных ответа на фронт-енд

Я использую фреймворк Django rest в бэкенде нашего приложения. В одной из конечных точек api нам нужно отправить большой объем данных в качестве ответа. Таким образом, функционал orm и сериализации занимает около 400мб для отправки данных на фронт-енд. Я использую memory_profiler, и когда мы вызываем другой api или тот же api, он показывает 400 МБ в начале, а затем еще 400 МБ используется, если вызывается та же конечная точка. Итого 800 МБ. Он продолжает добавляться каждый раз, когда мы вызываем api, пока не произойдет сбой.

Вот мой код --->

**views.py **
@api_view(["GET"])
@hasValidToken
def get_all_session_messages(request, user, identity_data, *args, **kwargs):
    try:
        return chat_services.get_all_session_messages(
            user.id,
            kwargs["session_id"],
        )
    except Exception as exc:
        return error(message=str(exc))

**services.py **
def get_all_session_messages(user_id, chat_session_id):
    try:
        query_responses = chat_repository.get_all_query_response_given_chat_id(
            chat_session_id
        )
        return ok(
            message="Successfully retrieved all chat session messages",
            response_data=query_responses,
        )
    except Exception as exc:
        raise Exception(
            "Error retreiving chat session messages in repository " + str(exc)
        )

**repository.py**
def get_all_query_response_given_chat_id(
    chat_id, limit=None, order_by_created_at=False
):
    if not order_by_created_at:
        if limit is not None:
            query_responses = QueryResponseTracking.objects.filter(chat_id=chat_id)[
                :limit
            ]
        else:
            query_responses = QueryResponseTracking.objects.filter(chat_id=chat_id)
    else:
        if limit is not None:
            query_responses = QueryResponseTracking.objects.filter(
                chat_id=chat_id
            ).order_by("-created_at")[:limit]
        else:
            query_responses = QueryResponseTracking.objects.filter(
                chat_id=chat_id
            ).order_by("-created_at")

    return QueryResponseTrackingSerializer(query_responses, many=True).data

**serializers.py**
class QueryResponseTrackingSerializer(serializers.ModelSerializer):
    class Meta:
        model = QueryResponseTracking
        fields = "__all__"

**models.py**
class QueryResponseTracking(models.Model):
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True)
    chat_id = models.CharField(max_length=200, default="-1")
    user_query = models.CharField(max_length=500)
    query_meta_data = models.JSONField(default=None, null=True)
    response = models.CharField(max_length=500, default=None, null=True)
    response_time = models.FloatField(default=None, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    feedback = models.BooleanField(default=None, null=True)

Нам нужны все поля и во фронт-энде.

Я пытался использовать gc.collect() после ответа в блоке finally во views. Но это не работает с первого раза. При втором api-запросе он освобождает немного памяти, например 200 МБ из 400 МБ. Но это происходит непоследовательно. Иногда освобождается всего 15 МБ. Поэтому он продолжает увеличивать память с каждым последующим запросом.

Вернуться на верх