Это было бы моим предложением для максимальной производительности.Имейте в виду, я сам не проверял это, но если я правильно понимаю вашу проблему, то не вижу причин, по которым она не будет работать.
Вам нужно хранить 100К строк данных, и в идеале вам это нужноданные для сохранения на стороне клиента.Лучшее решение здесь - использовать IndexedDB, потому что вы можете выполнять чтение и запись, как базу данных, и при этом иметь достаточно места для хранения.Как рекомендовано Soleil, я предлагаю вам использовать dexie
для взаимодействия с IndexedDB.Вам это не нужно, но вы, безусловно, должны иметь его из-за той гибкости, которую он вам даст.
Вы также должны быть в состоянии отразить эти изменения, и это не будет легко без толчкаработа переходит на другой поток.Итак, предложение звучит так:
async function seedData() {
// serialize your data, hopefully have unqiue id field on each row
const hundredK = toJSON(await fetch(source));
// IndexedDB doesn't have tremendous write speed, so it may be better to chunk your rows into
// 10k intervals for seem to perform the best but vary based on PC / browser implementation
const db = new Dexie("myDataSource");
// set version of Indexed to use (1 is preferred for best compatibility)
// and set the indexes
db.version(1).stores({
animals: 'id,type'
});
let mice = [];
for (let i = 0; i < hundredK.length; i++) {
mice.push({
id: i,
species: hundredK[i].species,
type: hundredK[i][0].type,
facts: {
someText: "this could come from hundredK, but I'll hardcode it",
someNumber: i
}
});
}
}
Итак, теперь данные находятся в IndexedDB, и вы можете запросить их в любое время.Теперь вам нужен способ перенести тяжелые детали производительности в другой поток.К счастью, есть redux-worker
import reducer from './reducers';
import task from './task';
import { createWorker } from 'redux-worker';
let worker = createWorker();
worker.registerReducer(reducer);
worker.registerTask('DIFF_IT', function (a) {
// do your diffing and expensive functions
task(a);
});
Включите вашего работника в действие
...
import { applyWorker } from 'redux-worker';
// you can't have any external dependencies for your worker, so bundle them or find a way to inline them
const worker = new Worker('./script.js') // alternatively inline an async function it with `greenlet-with-edge`
const enhancer = compose(applyMiddleware(thunk, logger), applyWorker(worker));
const store = createStore(rootReducer, {}, enhancer);
Передайте свою базу данных в свой компонент и зацепите обновление.Примените свое действие
// all in dexie docs
this.props.db.animals.hook('updating', (modifications, key, obj, tran) => {
if ("species" in modifications) {
this.props.actions.task(modifications.species, key, obj, tran);
}
})