コピーオンライト#
コピーオンライト(CoW)は、可能な限りコピーを回避することで、インデックスAPIを簡素化し、パフォーマンスを向上させるメカニズムです。CoWでは、他のDataFrameまたはSeriesから何らかの方法で派生したDataFrameまたはSeriesは、常にコピーとして動作します。コピーオンライトを効率的に使用する方法については、こちらを参照してください。
参照トラッキング#
DataFrameへの書き込み時にコピーを作成する必要があるかどうかを判断するために、値が別のDataFrameと共有されているかどうかを認識する必要があります。pandasは、コピーをトリガーする必要がある場合を判断するために、内部的に別のブロックと値を共有するすべてのBlocks
を追跡します。参照トラッキングメカニズムは、ブロックレベルで実装されています。
相互にメモリを共有する値を持つ各ブロックを追跡するカスタム参照トラッカーオブジェクトBlockValuesRefs
を使用します。参照は弱参照によって保持されます。メモリを共有するブロックのペアは、すべて同じBlockValuesRefs
オブジェクトを指す必要があります。あるブロックがスコープ外に出ると、そのブロックへの参照は消滅します。その結果、参照トラッカーオブジェクトは常に、いくつブロックがアクティブでメモリを共有しているかを認識しています。
DataFrame
またはSeries
オブジェクトが別のオブジェクトとデータを共有している場合、これらのオブジェクトそれぞれが独自のBlockManagerとBlockオブジェクトを持つ必要があります。つまり、(中間オブジェクトとは限らないDataFrameによって保持される)1つのBlockインスタンスは、常に1つのDataFrame/Seriesオブジェクトに対してのみ一意に使用される必要があります。たとえば、別のオブジェクトに同じBlockを使用する場合は、block.copy(deep=False)
を使用してBlockインスタンスの浅いコピーを作成できます(これにより、同じ基礎となる値を持つ新しいBlockインスタンスが作成され、参照が正しく設定されます)。
値に書き込む前に、参照トラッキングオブジェクトに、私たちとデータを共有する別のアクティブなブロックがあるかどうかを確認できます。実際にもう1つのアクティブなブロックがある場合は、書き込み前にコピーをトリガーできます。