• Kamil Trzciński's avatar
    Improve performance and memory usage of project export · 0e56c1e7
    Kamil Trzciński authored
    ActiveModel::Serialization is simple in that it recursively calls
    `as_json` on each object to serialize everything. However, for a model
    like a Project, this can generate a query for every single association,
    which can add up to tens of thousands of queries and lead to memory
    bloat.
    
    To improve this, we can do several things:
    
    1. We use `tree:` and `preload:` to automatically generate
       a list of all preloads that could be used to serialize
       objects in bulk.
    
    2. We observe that a single project has many issues, merge requests,
       etc. Instead of serializing everything at once, which could lead to
       database timeouts and high memory usage, we take each top-level
       association and serialize the data in batches.
    
    For example, we serialize the first 100 issues and preload all of
    their associated events, notes, etc. before moving onto the next
    batch. When we're done, we serialize merge requests in the same way.
    We repeat this pattern for the remaining associations specified in
    import_export.yml.
    0e56c1e7
project_tree_saver.rb 2.25 KB