2016-10-09 24 views
4

私は設定された間隔でいくつかのチャートが更新されているダッシュボードアプリケーションを持っています。私の最初の考えは、店内のデータを更新し、そこからすべてのチャートをフィードすることでした。Reduxストアはメモリリークを引き起こしますか?

しかし、それはメモリリークにつながる可能性がありますか? Reduxはデータが変更されるたびに新しいストアを作成し、古いものを保持しているためです。 〜2MBのデータが毎秒重ねてアプリケーションをクラッシュさせるでしょうか?

私が見る代わりに、データをローカル状態(setState)に保つことです。 もっと経験豊富なReact/Redux開発者がこのことについて私に助言してくれることを願っています。ありがとう!

答えて

4

ダン・アブラモフ、そのようなReduxのアドレスの生みの親、この懸念here

ノートは時々人々が再来について混乱し、すべてのアクションにそれを想定していること、状態のツリーが深くクローニングすることがあります。これは絶対に当てはまりません。変更された部分だけが参照を変更する必要があります。たとえば、アクションによって配列の1つの項目が変更された場合、実際にはその項目と配列をコピーする必要がありますが、配列内の他のすべての要素はIDを保持します。ほとんどの場合アクションは非常に対象となり、いくつかの状態キーに影響を与えるため、Reduxはデータ構造を深くネストしないようにデータを正規化することを推奨しているため、一般的なWebアプリケーションでは想像以上に問題はありません。

私はこれが答えの肉だと思います。

+0

これは、質問の中でいくつかの仮定を暴露しただけです。確かに、店舗全体がクローン化されているわけではありません。しかし、メモリリークの可能性は、古い状態への参照が格納されているかどうかに関係します。他の答えは、これがdevツールの場合に過ぎないことを示しているようです。 – amoebe

1

ユーザーのブラウザに2MB /秒のデータを重ねることはお勧めしません。 Reduxストアは、クライアント側のブラウザです。メモリリークに関する質問の他の部分は、私が知る限り起こらない。いくつかの有用なリンクがある:「Reduxのは、データ料金たびに新しいストアを作成し、古いものを維持しているので、」

Diagnose memory leaks using Chrome devtools

Four types of memory leaks to watch out for

3

バニラReduxはそれをしません、またはすべて Reduxストアがリークします。つまり、状態の参照を保持しているアプリケーションの残りの部分は、その状態がクリーンアップされないようにします。

例:

window.states = [] 
store.subscribe(() => { 
    window.states.push(store.getState()) 
}) 

のようなものが無制限メモリの増加を引き起こします。

また、Redux開発ツールの中には、時間の移動機能を提供するためにリークするものがあるため、本番環境ではそれらのツールがオフになっていることを確認してください。

3

まず、と非常に多くのデータが似ています。あなたのクライアントアプリケーションは実際にはには多くのデータが多いのでが必要ですか?

第2に、Reduxは「新しいストアを作成しません」。データを更新するための推奨されたアプローチに従っていると仮定すると、古いデータ参照は破棄され、ガベージコレクションされます。 Redux DevToolsはタイムトラベルのデバッグを可能にするために、Redux自体はデフォルトでは古い状態ツリーへの参照を保持しません。

Reduxドキュメントのいくつかのセクションを読むことができます。特に、http://redux.js.org/docs/faq/Performance.html,http://redux.js.org/docs/recipes/StructuringReducers.htmlを参照されたい。

バッチ更新のようなことができるアドオンを含む私のRedux addons catalogをブラウズすることもできます。

関連する問題