我有以下代码,其中我有一个基于函数的视图,它使用 ModelSerializer 序列化数据。我用 apache + mod_wsgi 运行它(为了简单起见,有 1 个工作线程、1 个子线程和 1 个 mod_wsgi 线程)。
有了这个,我的内存使用量显着增加(200M - 1G,基于查询的大小)并保持在那里并且即使在请求完成时也不会下降。在对同一视图/url 的后续请求中,内存每次都会略有增加,但不会有明显的跳跃。为了排除 django-filter 的问题,我修改了我的视图并自己编写了过滤查询。
通常怀疑 DEBUG=True 被排除,因为我没有在 DEBUG 模式下运行。我什至尝试使用 guppy 来查看发生了什么,但我无法使用 guppy。有人可以帮忙为什么请求完成后内存使用量没有下降以及如何调试它?
更新:我正在使用默认的缓存设置,即我根本没有定义它,在这种情况下,我假设它将使用本地内存作为文档中提到的缓存。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
class MeterData(models.Model):
meter = models.ForeignKey(Meter)
datetime = models.DateTimeField()
# Active Power Total
w_total = models.DecimalField(max_digits=13, decimal_places=2,
null=True)
...
class MeterDataSerializer(serializers.ModelSerializer):
class Meta:
model = MeterData
exclude = ('meter', )
@api_view(['GET', ])
@permission_classes((AllowAny,))
def test(request):
startDate = request.GET.get('startDate', None)
endDate = request.GET.get('endDate', None)
meter_pk = request.GET.get('meter', None)
# Writing query ourself instead of using django-filter to
# to keep things simple.
queryset = MeterData.objects.filter(meter__pk=meter_pk,
datetime__gte=startDate,
datetime__lte=endDate)
logger.info(queryset.query)
kwargs = {}
kwargs['context'] = {
'request': request,
'view': test,
'format': 'format',
}
kwargs['many'] = True
serializer = MeterDataSerializer(queryset, **kwargs)
return Response(serializer.data)