Skip to content

Commit

Permalink
[Ruby] Use Ruby autoload to lower memory usage and load times
Browse files Browse the repository at this point in the history
Fixes OpenAPITools#12648

Requiring all models up front can be very expensive in both time and
memory if there are many models. In an example client with 6000 models,
this would consume nearly 400MB of memory and take about 7 seconds to
load. This is mostly unnecessary as most users of the client library
will only actually use a small percentage of the library.

The changes in this commit use Ruby's autoload capability to defer the
loading until the constant is actually used. In that same example client
with 6000 models, when initially requiring the library, the memory
usage dropped to ~20MB and loaded in 0.3 seconds. As the constants are
loaded on-demand, the memory would increase towards that 400MB ceiling,
but if only a few constants are actually used, then memory will never
actually hit that ceiling.

An additional side effect of using Ruby's autoload is that the order of
declaring the constants is not important, as Ruby will naturally load
them in the correct order when they are needed. Thus, this commit obviates
PR OpenAPITools#9103 and fixes OpenAPITools#4690.
  • Loading branch information
Fryguy committed Jun 23, 2022
1 parent c3970d7 commit 1bd63ad
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 126 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,14 @@ require '{{gemName}}/configuration'
# Models
{{#models}}
{{#model}}
{{^parent}}
require '{{gemName}}/{{modelPackage}}/{{classFilename}}'
{{/parent}}
{{/model}}
{{/models}}
{{#models}}
{{#model}}
{{#parent}}
require '{{gemName}}/{{modelPackage}}/{{classFilename}}'
{{/parent}}
{{moduleName}}.autoload :{{classname}}, '{{gemName}}/{{modelPackage}}/{{classFilename}}'
{{/model}}
{{/models}}

# APIs
{{#apiInfo}}
{{#apis}}
require '{{importPath}}'
{{moduleName}}.autoload :{{classname}}, '{{importPath}}'
{{/apis}}
{{/apiInfo}}

Expand Down
110 changes: 55 additions & 55 deletions samples/client/petstore/ruby-faraday/lib/petstore.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,63 +17,63 @@
require 'petstore/configuration'

# Models
require 'petstore/models/additional_properties_class'
require 'petstore/models/all_of_with_single_ref'
require 'petstore/models/animal'
require 'petstore/models/api_response'
require 'petstore/models/array_of_array_of_number_only'
require 'petstore/models/array_of_number_only'
require 'petstore/models/array_test'
require 'petstore/models/capitalization'
require 'petstore/models/cat_all_of'
require 'petstore/models/category'
require 'petstore/models/class_model'
require 'petstore/models/client'
require 'petstore/models/deprecated_object'
require 'petstore/models/dog_all_of'
require 'petstore/models/enum_arrays'
require 'petstore/models/enum_class'
require 'petstore/models/enum_test'
require 'petstore/models/file'
require 'petstore/models/file_schema_test_class'
require 'petstore/models/foo'
require 'petstore/models/foo_get_default_response'
require 'petstore/models/format_test'
require 'petstore/models/has_only_read_only'
require 'petstore/models/health_check_result'
require 'petstore/models/list'
require 'petstore/models/map_test'
require 'petstore/models/mixed_properties_and_additional_properties_class'
require 'petstore/models/model200_response'
require 'petstore/models/model_return'
require 'petstore/models/name'
require 'petstore/models/nullable_class'
require 'petstore/models/number_only'
require 'petstore/models/object_with_deprecated_fields'
require 'petstore/models/order'
require 'petstore/models/outer_composite'
require 'petstore/models/outer_enum'
require 'petstore/models/outer_enum_default_value'
require 'petstore/models/outer_enum_integer'
require 'petstore/models/outer_enum_integer_default_value'
require 'petstore/models/outer_object_with_enum_property'
require 'petstore/models/pet'
require 'petstore/models/read_only_first'
require 'petstore/models/single_ref_type'
require 'petstore/models/special_model_name'
require 'petstore/models/tag'
require 'petstore/models/user'
require 'petstore/models/cat'
require 'petstore/models/dog'
Petstore.autoload :AdditionalPropertiesClass, 'petstore/models/additional_properties_class'
Petstore.autoload :AllOfWithSingleRef, 'petstore/models/all_of_with_single_ref'
Petstore.autoload :Animal, 'petstore/models/animal'
Petstore.autoload :ApiResponse, 'petstore/models/api_response'
Petstore.autoload :ArrayOfArrayOfNumberOnly, 'petstore/models/array_of_array_of_number_only'
Petstore.autoload :ArrayOfNumberOnly, 'petstore/models/array_of_number_only'
Petstore.autoload :ArrayTest, 'petstore/models/array_test'
Petstore.autoload :Capitalization, 'petstore/models/capitalization'
Petstore.autoload :Cat, 'petstore/models/cat'
Petstore.autoload :CatAllOf, 'petstore/models/cat_all_of'
Petstore.autoload :Category, 'petstore/models/category'
Petstore.autoload :ClassModel, 'petstore/models/class_model'
Petstore.autoload :Client, 'petstore/models/client'
Petstore.autoload :DeprecatedObject, 'petstore/models/deprecated_object'
Petstore.autoload :Dog, 'petstore/models/dog'
Petstore.autoload :DogAllOf, 'petstore/models/dog_all_of'
Petstore.autoload :EnumArrays, 'petstore/models/enum_arrays'
Petstore.autoload :EnumClass, 'petstore/models/enum_class'
Petstore.autoload :EnumTest, 'petstore/models/enum_test'
Petstore.autoload :File, 'petstore/models/file'
Petstore.autoload :FileSchemaTestClass, 'petstore/models/file_schema_test_class'
Petstore.autoload :Foo, 'petstore/models/foo'
Petstore.autoload :FooGetDefaultResponse, 'petstore/models/foo_get_default_response'
Petstore.autoload :FormatTest, 'petstore/models/format_test'
Petstore.autoload :HasOnlyReadOnly, 'petstore/models/has_only_read_only'
Petstore.autoload :HealthCheckResult, 'petstore/models/health_check_result'
Petstore.autoload :List, 'petstore/models/list'
Petstore.autoload :MapTest, 'petstore/models/map_test'
Petstore.autoload :MixedPropertiesAndAdditionalPropertiesClass, 'petstore/models/mixed_properties_and_additional_properties_class'
Petstore.autoload :Model200Response, 'petstore/models/model200_response'
Petstore.autoload :ModelReturn, 'petstore/models/model_return'
Petstore.autoload :Name, 'petstore/models/name'
Petstore.autoload :NullableClass, 'petstore/models/nullable_class'
Petstore.autoload :NumberOnly, 'petstore/models/number_only'
Petstore.autoload :ObjectWithDeprecatedFields, 'petstore/models/object_with_deprecated_fields'
Petstore.autoload :Order, 'petstore/models/order'
Petstore.autoload :OuterComposite, 'petstore/models/outer_composite'
Petstore.autoload :OuterEnum, 'petstore/models/outer_enum'
Petstore.autoload :OuterEnumDefaultValue, 'petstore/models/outer_enum_default_value'
Petstore.autoload :OuterEnumInteger, 'petstore/models/outer_enum_integer'
Petstore.autoload :OuterEnumIntegerDefaultValue, 'petstore/models/outer_enum_integer_default_value'
Petstore.autoload :OuterObjectWithEnumProperty, 'petstore/models/outer_object_with_enum_property'
Petstore.autoload :Pet, 'petstore/models/pet'
Petstore.autoload :ReadOnlyFirst, 'petstore/models/read_only_first'
Petstore.autoload :SingleRefType, 'petstore/models/single_ref_type'
Petstore.autoload :SpecialModelName, 'petstore/models/special_model_name'
Petstore.autoload :Tag, 'petstore/models/tag'
Petstore.autoload :User, 'petstore/models/user'

# APIs
require 'petstore/api/another_fake_api'
require 'petstore/api/default_api'
require 'petstore/api/fake_api'
require 'petstore/api/fake_classname_tags123_api'
require 'petstore/api/pet_api'
require 'petstore/api/store_api'
require 'petstore/api/user_api'
Petstore.autoload :AnotherFakeApi, 'petstore/api/another_fake_api'
Petstore.autoload :DefaultApi, 'petstore/api/default_api'
Petstore.autoload :FakeApi, 'petstore/api/fake_api'
Petstore.autoload :FakeClassnameTags123Api, 'petstore/api/fake_classname_tags123_api'
Petstore.autoload :PetApi, 'petstore/api/pet_api'
Petstore.autoload :StoreApi, 'petstore/api/store_api'
Petstore.autoload :UserApi, 'petstore/api/user_api'

module Petstore
class << self
Expand Down
110 changes: 55 additions & 55 deletions samples/client/petstore/ruby/lib/petstore.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,63 +17,63 @@
require 'petstore/configuration'

# Models
require 'petstore/models/additional_properties_class'
require 'petstore/models/all_of_with_single_ref'
require 'petstore/models/animal'
require 'petstore/models/api_response'
require 'petstore/models/array_of_array_of_number_only'
require 'petstore/models/array_of_number_only'
require 'petstore/models/array_test'
require 'petstore/models/capitalization'
require 'petstore/models/cat_all_of'
require 'petstore/models/category'
require 'petstore/models/class_model'
require 'petstore/models/client'
require 'petstore/models/deprecated_object'
require 'petstore/models/dog_all_of'
require 'petstore/models/enum_arrays'
require 'petstore/models/enum_class'
require 'petstore/models/enum_test'
require 'petstore/models/file'
require 'petstore/models/file_schema_test_class'
require 'petstore/models/foo'
require 'petstore/models/foo_get_default_response'
require 'petstore/models/format_test'
require 'petstore/models/has_only_read_only'
require 'petstore/models/health_check_result'
require 'petstore/models/list'
require 'petstore/models/map_test'
require 'petstore/models/mixed_properties_and_additional_properties_class'
require 'petstore/models/model200_response'
require 'petstore/models/model_return'
require 'petstore/models/name'
require 'petstore/models/nullable_class'
require 'petstore/models/number_only'
require 'petstore/models/object_with_deprecated_fields'
require 'petstore/models/order'
require 'petstore/models/outer_composite'
require 'petstore/models/outer_enum'
require 'petstore/models/outer_enum_default_value'
require 'petstore/models/outer_enum_integer'
require 'petstore/models/outer_enum_integer_default_value'
require 'petstore/models/outer_object_with_enum_property'
require 'petstore/models/pet'
require 'petstore/models/read_only_first'
require 'petstore/models/single_ref_type'
require 'petstore/models/special_model_name'
require 'petstore/models/tag'
require 'petstore/models/user'
require 'petstore/models/cat'
require 'petstore/models/dog'
Petstore.autoload :AdditionalPropertiesClass, 'petstore/models/additional_properties_class'
Petstore.autoload :AllOfWithSingleRef, 'petstore/models/all_of_with_single_ref'
Petstore.autoload :Animal, 'petstore/models/animal'
Petstore.autoload :ApiResponse, 'petstore/models/api_response'
Petstore.autoload :ArrayOfArrayOfNumberOnly, 'petstore/models/array_of_array_of_number_only'
Petstore.autoload :ArrayOfNumberOnly, 'petstore/models/array_of_number_only'
Petstore.autoload :ArrayTest, 'petstore/models/array_test'
Petstore.autoload :Capitalization, 'petstore/models/capitalization'
Petstore.autoload :Cat, 'petstore/models/cat'
Petstore.autoload :CatAllOf, 'petstore/models/cat_all_of'
Petstore.autoload :Category, 'petstore/models/category'
Petstore.autoload :ClassModel, 'petstore/models/class_model'
Petstore.autoload :Client, 'petstore/models/client'
Petstore.autoload :DeprecatedObject, 'petstore/models/deprecated_object'
Petstore.autoload :Dog, 'petstore/models/dog'
Petstore.autoload :DogAllOf, 'petstore/models/dog_all_of'
Petstore.autoload :EnumArrays, 'petstore/models/enum_arrays'
Petstore.autoload :EnumClass, 'petstore/models/enum_class'
Petstore.autoload :EnumTest, 'petstore/models/enum_test'
Petstore.autoload :File, 'petstore/models/file'
Petstore.autoload :FileSchemaTestClass, 'petstore/models/file_schema_test_class'
Petstore.autoload :Foo, 'petstore/models/foo'
Petstore.autoload :FooGetDefaultResponse, 'petstore/models/foo_get_default_response'
Petstore.autoload :FormatTest, 'petstore/models/format_test'
Petstore.autoload :HasOnlyReadOnly, 'petstore/models/has_only_read_only'
Petstore.autoload :HealthCheckResult, 'petstore/models/health_check_result'
Petstore.autoload :List, 'petstore/models/list'
Petstore.autoload :MapTest, 'petstore/models/map_test'
Petstore.autoload :MixedPropertiesAndAdditionalPropertiesClass, 'petstore/models/mixed_properties_and_additional_properties_class'
Petstore.autoload :Model200Response, 'petstore/models/model200_response'
Petstore.autoload :ModelReturn, 'petstore/models/model_return'
Petstore.autoload :Name, 'petstore/models/name'
Petstore.autoload :NullableClass, 'petstore/models/nullable_class'
Petstore.autoload :NumberOnly, 'petstore/models/number_only'
Petstore.autoload :ObjectWithDeprecatedFields, 'petstore/models/object_with_deprecated_fields'
Petstore.autoload :Order, 'petstore/models/order'
Petstore.autoload :OuterComposite, 'petstore/models/outer_composite'
Petstore.autoload :OuterEnum, 'petstore/models/outer_enum'
Petstore.autoload :OuterEnumDefaultValue, 'petstore/models/outer_enum_default_value'
Petstore.autoload :OuterEnumInteger, 'petstore/models/outer_enum_integer'
Petstore.autoload :OuterEnumIntegerDefaultValue, 'petstore/models/outer_enum_integer_default_value'
Petstore.autoload :OuterObjectWithEnumProperty, 'petstore/models/outer_object_with_enum_property'
Petstore.autoload :Pet, 'petstore/models/pet'
Petstore.autoload :ReadOnlyFirst, 'petstore/models/read_only_first'
Petstore.autoload :SingleRefType, 'petstore/models/single_ref_type'
Petstore.autoload :SpecialModelName, 'petstore/models/special_model_name'
Petstore.autoload :Tag, 'petstore/models/tag'
Petstore.autoload :User, 'petstore/models/user'

# APIs
require 'petstore/api/another_fake_api'
require 'petstore/api/default_api'
require 'petstore/api/fake_api'
require 'petstore/api/fake_classname_tags123_api'
require 'petstore/api/pet_api'
require 'petstore/api/store_api'
require 'petstore/api/user_api'
Petstore.autoload :AnotherFakeApi, 'petstore/api/another_fake_api'
Petstore.autoload :DefaultApi, 'petstore/api/default_api'
Petstore.autoload :FakeApi, 'petstore/api/fake_api'
Petstore.autoload :FakeClassnameTags123Api, 'petstore/api/fake_classname_tags123_api'
Petstore.autoload :PetApi, 'petstore/api/pet_api'
Petstore.autoload :StoreApi, 'petstore/api/store_api'
Petstore.autoload :UserApi, 'petstore/api/user_api'

module Petstore
class << self
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
# Models

# APIs
require 'x_auth_id_alias/api/usage_api'
XAuthIDAlias.autoload :UsageApi, 'x_auth_id_alias/api/usage_api'

module XAuthIDAlias
class << self
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
# Models

# APIs
require 'dynamic_servers/api/usage_api'
DynamicServers.autoload :UsageApi, 'dynamic_servers/api/usage_api'

module DynamicServers
class << self
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
require 'petstore/configuration'

# Models
require 'petstore/models/map_alias'
require 'petstore/models/array_alias'
Petstore.autoload :ArrayAlias, 'petstore/models/array_alias'
Petstore.autoload :MapAlias, 'petstore/models/map_alias'

# APIs
require 'petstore/api/usage_api'
Petstore.autoload :UsageApi, 'petstore/api/usage_api'

module Petstore
class << self
Expand Down

0 comments on commit 1bd63ad

Please sign in to comment.