In youth there was such a mistake, at the start of the program I downloaded a lot of data from the database, then I wrote wrappers to the collections that these sets synchronized. At the start, the program was loaded for a long time and there were a lot more shoals. I agree with @AdamSkywalker it all depends on the business requirements.
There is an alternative approach. Download data for a specific operation, for example, you need to find a contract, you do not need to download all 100,500 contracts. And then scroll and search for the desired contract. This is wrong from the UX point of view. The user anyway at one point in time does not see 100,500 contracts. Download the 10 latest contracts and show them to the user. He did not find, entered the search criteria (filter + sorting) and under this filter the number of contracts the user sees is required, after he chooses the contract, the whole list is not needed, it is ejected from memory.