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 МБ. Поэтому он продолжает увеличивать память с каждым последующим запросом.