Selaa lähdekoodia

Merge pull request #2613 from aausch/fix_memory_leak

 optimization and quick workaround to memory leak
Jisi Liu 8 vuotta sitten
vanhempi
commit
f6d8c83384
1 muutettua tiedostoa jossa 8 lisäystä ja 1 poistoa
  1. 8 1
      python/google/protobuf/reflection.py

+ 8 - 1
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