私は読取り専用の非常に大きなデータフレームを持っているので、私はマルチプロセッシングのための計算を行いたいので、データフレームをグローバルに設定します。しかし、これは、各プロセスに対して、プログラムがデータフレームを個別にコピーすることを意味していますか(つまり、高速で共有されます)。非常に大きな読み取り専用オブジェクトを持つPythonのmultiprocessing.map?
答えて
が、私はそれを正しく理解していればあなたはデータフレームがnumpyのNumPy ndarray構造との上に構築されているので、Pandas DataFrameにmultiprocessing.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に適している問題があります。
私はそれができます願っています。
すべてのサブプロセスには独自のリソースがあるため、これは意味します。より正確には、すべてのサブプロセスは、実装によって決定された元のデータフレームの一部をコピーします。
しかし、それは高速で共有されますか?よく分かりません。あなたのデータフレームがw/rロックを実装していない限り、共有されたものを読むか、読みとられたものは同じです。しかし、なぜデータフレームは読み取り操作をロックする必要がありますか?それは意味をなさない。
- 1. 不正なパーティションテーブルを持つUSBフォーマット(読み取り専用fs)
- 2. ほとんど読み取り専用のオブジェクトを持つASP.NETスレッドセーフキャッシュオブジェクトの使用
- 3. 同じ値を持つ読み取り専用列で読み取り専用プロパティをオーバーライドします。
- 4. 読み取り専用自動対(読み取り専用)プロパティ
- 5. pythonマルチスレッドは、読み取り専用メモリバッファバイパスを読み取るGIL
- 6. 読み取り専用アクセス権を持つファイルをチェックアウトできない
- 7. プライベートリポジトリへの読み取り専用アクセスを持つGitHubアクセストークン
- 8. 読み取り専用のプロパティを持つDjangoモデルフォーム
- 9. Python: "List.append = 'リスト'オブジェクト属性 'append'は読み取り専用です
- 10. オブジェクトを書き込めません。読み取り専用ファイルシステム
- 11. C#Windowsフォームに大きな読み取り専用配列を含める
- 12. CurrentCulture.DateTimeFormat.LongTimePattern読み取り専用
- 13. 読み取り専用プロパティ
- 14. 読み取り専用プロパティ
- 15. 読み取り専用テキストボックス
- 16. 読み取り専用
- 17. 読み取り専用アソシエーション
- 18. 読み取り専用TFS
- 19. は読み取り専用
- 20. テキストを読み取り専用/非選択にする
- 21. Ubuntu非システムファイル用の読み取り専用ファイルシステム
- 22. C#ファイルを読み取り専用で読み取り/書き込みする
- 23. 読み取り専用トランザクション - タイムスタンプバウンドの読み取りのパフォーマンス
- 24. 読み取り専用または読み込み専用のPythonカスタム区切り文字
- 25. ASP.Net MVC3でSystem.Web.UI.Pageオブジェクト(読み取り専用)を取得
- 26. プライベート静的読み取り専用フィールドの大文字化
- 27. Javaの非常に大きな画像ファイルから領域を読み取る
- 28. 非常に大きなxlsxファイルをPythonで読む
- 29. Pythonの非常に大きなブールリスト
- 30. にjava.io.IOException:読み取り専用ファイルシステム
。なお、ランダムなロックが他のスレッドによってロックされている場合(ロックの*ロット*がある場合)、forkしたプロセスはアクセスしようとするとデッドロックします。 – o11c