Как вы правильно заметили, узким местом в вашем случае является тот факт, что вы пытаетесь загрузить весь набор данных одновременно. Вместо этого вам следует рассмотреть возможность загрузки этих данных в страницы (порции) и, возможно, иметь оконный компонент, который загружает / отображает только те данные, которые отображаются в данный момент.
Как отметили другие, JSON - не лучший формат для хранения огромных наборов данных. база данных намного лучше, даже что-то простое и маленькое, как SQLite .
Но если вы все же предпочитаете продолжить работу с JSON, я бы порекомендовал попробовать одну из библиотек, которая позволяет вам анализировать частичные блоки JSON и несколько имитировать то, что было бы, если бы вы использовали базу данных и загрузку данных с разбивкой по страницам.
Например, stream-json (Модуль NodeJS, но я думаю, что можно легко найти что-то похожее для любой технологии бэкенда).
stream-json - это микробиблиотека потока node.jsКомпоненты с минимальными зависимостями для создания пользовательских процессоров данных, ориентированных на обработку огромных файлов JSON при минимальных затратах памяти. Он может анализировать файлы JSON, значительно превышающие доступную память. Даже отдельные примитивные элементы данных (ключи, строки и числа) могут передаваться поэтапно.
const { chain } = require('stream-chain')
const { parser } = require('stream-json')
const { pick } = require('stream-json/filters/Pick')
const { streamValues } = require('stream-json/streamers/StreamValues')
const fs = require('fs')
const pipeline = chain([
fs.createReadStream('sample.json'),
parser(),
pick({ filter: 'data' }),
streamValues(),
data => {
const value = data.value
return value && value.department === 'accounting' ? data : null
}
])
let counter = 0
pipeline.on('data', () => ++counter)
pipeline.on('end', () =>
console.log(`The accounting department has ${counter} employees.`)
)