From 3a2ad8e68c669eebcc9847e6c2a664e323e8da1d Mon Sep 17 00:00:00 2001 From: imdark Date: Wed, 17 May 2017 11:49:30 -0700 Subject: [PATCH] in order to solve the memory leak at #5146 Large encoded string take a very long time to to release from memory, but if we just pass the stream directly into json.load we get much better memory performance. --- rest_framework/parsers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py index 238382364..1a4c24387 100644 --- a/rest_framework/parsers.py +++ b/rest_framework/parsers.py @@ -22,6 +22,7 @@ from django.utils.six.moves.urllib import parse as urlparse from rest_framework import renderers from rest_framework.exceptions import ParseError +import codecs class DataAndFiles(object): @@ -61,8 +62,8 @@ class JSONParser(BaseParser): encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) try: - data = stream.read().decode(encoding) - return json.loads(data) + decoded_stream = codecs.decode(stream, encoding) + return json.load(decoded_stream) except ValueError as exc: raise ParseError('JSON parse error - %s' % six.text_type(exc))