問題タブ [dill]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Dill ファイルが RAM に対して大きすぎる場合、別の方法でロードできますか
dill ファイルが RAM に大きすぎる場合、別の方法でロードすることは可能ですか。たとえば、約 1.2 GB のシリアル化されたオブジェクトをロードすると、python3 はメモリ エラーをスローします。
RAMが小さすぎるため、これは合格しません。ただし、RAM を過負荷にせずにデータを抽出できるように、別の方法でロードすることは可能ですか?
python - Dill を使用して scikit-learn/statsmodels モデルをシリアル化する際の落とし穴は何ですか?
すべての依存関係 (コード + データ) がアーティファクトにパッケージ化され、このアーティファクトを使用してモデルを初期化し、予測できるように、scikit-learn/statsmodels モデルをシリアル化する必要があります。pickle の使用はmodule
オプションではありません。これは、データの依存関係のみを処理するためです (コードはパッケージ化されません)。ということで、ディルで実験をしてきました。私の質問をより正確にするために、モデルを構築して永続化する例を次に示します。
これに対応して、永続化されたモデルを (新しいセッションで) 初期化し、予測を行う方法を次に示します。このコードは明示的に初期化したり、class Model
.
このようにディルを使った人はいますか?データ サイエンティストがModelWrapper class
実装する各モデルを拡張し、モデルを永続化するインフラストラクチャを構築し、モデルをサービスとして展開し、モデルのライフサイクル全体を管理するという考え方です。
セキュリティへの影響 (任意のコードの実行) とscikit-learn
、モデルを提供するマシンにモジュールをインストールする必要があるという要件以外に、このアプローチには落とし穴がありますか? コメントやアドバイスの言葉は最も役に立ちます。
python - Pythonオブジェクトをファイルに保存するためのディルシリアライゼーションを高速化する方法
ドキュメントには、sys.getsizeof() の出力はバイト単位であると記載されています。クラス インスタンスとリストの辞書であるデータ構造を格納しようとしています。このクラス インスタンスのディクショナリで sys.getsizeof() を実行したところ、3352 バイトでした。後でロードできるように dill を使用してシリアル化していますが、非常に長い時間がかかります。
ファイル サイズはすでに 260 MB であり、sys.getsizeof() で指定された 3352 バイトよりもはるかに大きくなっています。値が異なる理由と、保存に時間がかかる理由を知っている人はいますか?
4GB メモリの Mac Air で実行しているときに、このようなオブジェクトを保存するより効率的な方法はありますか?
それは信じられないほどのツールです。メモリ不足の問題を解決するために微調整できるパラメーターがあるかどうかはわかりません。pickle には protocol=2 があることは知っていますが、ディルだけでなく環境も保存していないようです。
python - `pickle`: さらに別の `ImportError: No module named my_module`
MyClass
で定義されたクラスがありmy_module
ます。問題のクラスのインスタンスをピクルMyClass
するメソッドがあります。pickle_myself
にあることを確認しmy_module
ましたPYTHONPATH
。インタープリターでは、実行は正常に__import__('my_module')
機能します。
ただし、最終的にファイルをロードすると、次のようになります。
私が確認したいくつかのこと:
の場所を変更していません
my_module.py
(モジュールのディレクトリを変更した後の Python pickling )代わりに使用しようとしまし
dill
たが、それでも同じエラーが発生します( python ImportError の詳細 No module named )
編集 - エラーを再現するおもちゃの例:
例自体は、多数のファイルに分散しています。
まず、モジュールがありますball
( というファイルに保存されていますball.py
):
次に、モジュールがありますtest_environment
:
次に、環境を作成し、永続化し、ロードするための関数を含むモジュールを用意しましたmake_persist_load
。
次に、すべてをまとめるスクリプトを次のように作成しますtest_serialization.py
。
このおもちゃの例を簡単に使用できるようにするために、すべてを Github リポジトリに配置しました。このリポジトリは、選択したディレクトリに複製するだけで済みます。. 含まれている手順を参照してくださいREADME
。これもここに複製します。
指示:
1) リポジトリをディレクトリにクローンします。
2) リポジトリ ディレクトリを PYTHONPATH に追加します。
3) を開きtest_serialization.py
、変数MAKE_AND_PERSIST
を に設定しますTrue
。インタープリターでスクリプトを実行します。
4) 以前のインタプリタ インスタンスを閉じて、新しいインタプリタ インスタンスを起動します。でにtest_serialization.py
変更MAKE_AND_PERSIST
するFalse
と、これはプログラムで に設定さLOAD
れTrue
ます。スクリプトをインタープリターで実行すると、ImportError: No module named test_environment
.
5) デフォルトでは、ピクルスの代わりにディルを使用するようにテストが設定されています。これを変更するには、 および に進みtest_environment.py
、make_persist_load.py
必要に応じてインポートを変更します。
編集: dill '0.2.5.dev0' に切り替えた後、dill.detect.trace(True)
出力
編集:おもちゃの例は、Mac/Ubuntu (つまり、Unix のようなシステム?) で実行すると完全に機能します。Windows でのみ失敗します。
python - Python の pickle/cpickle/dill はインポートを高速化できますか?
pickle/dill/cpickle を使用して、インポートされたモジュールをピクルしてインポート速度を向上させることはできますか? たとえば、Shapely モジュールは、私のシステムでは、必要なすべての依存関係を見つけてロードするのに 5 秒かかります。これは本当に避けたいことです。
インポートを一度ピクルして、毎回遅いインポートを行う代わりに、そのピクルを再利用できますか?