2017-08-30 7 views
0

私は読取り専用の非常に大きなデータフレームを持っているので、私はマルチプロセッシングのための計算を行いたいので、データフレームをグローバルに設定します。しかし、これは、各プロセスに対して、プログラムがデータフレームを個別にコピーすることを意味していますか(つまり、高速で共有されます)。非常に大きな読み取り専用オブジェクトを持つPythonのmultiprocessing.map?

+0

。なお、ランダムなロックが他のスレッドによってロックされている場合(ロックの*ロット*がある場合)、forkしたプロセスはアクセスしようとするとデッドロックします。 – o11c

答えて

1

が、私はそれを正しく理解していればあなたはデータフレームがnumpyのNumPy ndarray構造との上に構築されているので、Pandas DataFramemultiprocessing.mapを使用しようとしていることにより、任意の利益を得ることはありませんすでに、GILを解放SMPハードウェアにスケール、使用可能な場所でベクトル化された機械命令を使用します。

あなたが言うように、大量のRAM消費、データコピー、または共有メモリロックのオーバーヘッドがDataFrame構造に無駄になっている可能性があります。 NumPyとPythonのmultiprocessingモジュールの組み合わせに関するパフォーマンスの考慮事項については、SO Question: Multiprocessing.Pool makes Numpy matrix multiplication slowerで解説しています。

それはあなたがフォーク経由によるOSの牛の周りos.fork()れ、(コピー・オン・ライト)のセマンティクスコードを書くことを示唆しているので、読み取り専用としてあなたは、このデータフレームを処理しているという事実は興味深いです()システムコールは、子プロセスとデータを共有するための安価な方法であり、それぞれがさまざまな方法で日付を分析できるようにする必要があります。 (データに書き込むコードは、新鮮なページの割り当てやコピーを引き起こすでしょう)。

マルチモジュールは、(少なくとものUnix、Linux、および同様のシステムに)フードの下フォーク()システムコールを使用しています。 マルチプロセス関数のいずれかを呼び出す、またはサブプロセスを作成するオブジェクトをインスタンス化する前に、この大きなデータ構造(DataFrame)を作成して完全に埋め込むと、各プロセスが暗黙的に継承したDataFrameのコピーにアクセスできる場合があります。私はすぐにテストコードを作成する時間がありません。それはうまくいくかもしれない。

結果を親プロセスまたは委任プロセスに集約する場合は、IPC(プロセス間通信)メカニズムを使用して結果をまとめることができます。マルチプロセスフォークのメソッドを呼び出す前にデータを初期化して暗黙的にデータを共有できた場合は、multiprocessing.Queueを簡単にインスタンス化し、その結果をフィードに渡すことができます。それに失敗しても、個人的には、同じシステム上またはそのLANセグメント上の他のシステム上で、Redisのインスタンスを設定することを検討します。 Redisは、APIとPythonモジュール(Redisの結果を高性能に非直列化するためのhiredisの自動/透過サポート)を使用して、非常に効率的で、構成と保守が非常に簡単です。

Redisでは、必要に応じて複数のノードにアプリケーションを配布することも容易になります。もちろん、PySparkを使用すると、Pandas DataFramesからApache Spark RDD Sets(またはSpark SQL "DataFrames")にかなりよくマッピングされる多くの機能を利用できます。ここ数年前の記事:Databricks: From Pandas to Apache Spark's DataFrames

一般に、Apache Sparkの全ポイントは、データ計算を別々のノードに分散することです。これは、単一のマシン内のコアに分散させるよりも本質的に拡張性があります。それぞれがロードされたデータセットのその塊を得ることができるので、(その後、懸念がノードへのI/Oに煮詰める。それはHDFSに適している問題があります。

私はそれができます願っています。

0

すべてのサブプロセスには独自のリソースがあるため、これは意味します。より正確には、すべてのサブプロセスは、実装によって決定された元のデータフレームの一部をコピーします。

しかし、それは高速で共有されますか?よく分かりません。あなたのデータフレームがw/rロックを実装していない限り、共有されたものを読むか、読みとられたものは同じです。しかし、なぜデータフレームは読み取り操作をロックする必要がありますか?それは意味をなさない。

関連する問題