From 2c36cc30dd9e60f4172db6c55d552aebc692bea2 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Fri, 20 Jan 2017 15:54:28 -0500 Subject: cache generated classes, optimization and quick workaround to memory leak --- python/google/protobuf/reflection.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'python') diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py index 51c83321..05bafd69 100755 --- a/python/google/protobuf/reflection.py +++ b/python/google/protobuf/reflection.py @@ -61,6 +61,8 @@ else: # Part of the public interface, but normally only used by message factories. GeneratedProtocolMessageType = message_impl.GeneratedProtocolMessageType +MESSAGE_CLASS_CACHE = {} + def ParseMessage(descriptor, byte_str): """Generate a new Message instance from this Descriptor and a byte string. @@ -104,11 +106,16 @@ def MakeClass(descriptor): Returns: The Message class object described by the descriptor. """ + if descriptor in MESSAGE_CLASS_CACHE: + return MESSAGE_CLASS_CACHE[descriptor] + attributes = {} for name, nested_type in descriptor.nested_types_by_name.items(): attributes[name] = MakeClass(nested_type) attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor - return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), + result = GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), attributes) + MESSAGE_CLASS_CACHE[descriptor] = result + return result -- cgit v1.2.3