7

マルチユーザー環境でPythonで記述されたさまざまなツールで構成されるフレームワークがあります。

初めてシステムにログインして1つのコマンドを開始するときは、数行のヘルプを表示するだけで6秒かかります。すぐに同じコマンドをもう一度発行すると、0.1秒かかります。数分後、6秒に戻ります。(短期間のキャッシュの証明)

システムはGPFS上にあるため、ディスクスループットは問題ないはずですが、システム内のファイルの量が原因でアクセスが低くなる可能性があります。

strace -e open python tool | wc -l

ツールの起動時にアクセスされている2154ファイルを示しています。

strace -e open python tool | grep ENOENT | wc -l

は、検索されている1945の欠落ファイルを示しています。(非常に悪いヒット/ミス比はあなたが私に尋ねます:-)

ツールのロードにかかる過度の時間は、これらすべてのファイルについてGPFSに照会することによって消費され、テスト方法はわかりませんが、これらは次の呼び出し(システムまたはGPFSレベルのいずれか)のためにキャッシュされます。 /証明する。システムへのrootアクセス権がなく、GPFSと/tmpにしか書き込むことができません。

これを改善することは可能python quest for missing filesですか?

これを簡単な方法でテストする方法について何かアイデアはありますか?(/ tmpにすべてを再インストールするのは簡単ではありません。多くのパッケージが関係しているため、virtualenvはgpfsシステム上のファイルをリンクしているだけなので、どちらも役に立ちません(私は思います)。

もちろん、フォークするデーモンを用意するという選択肢もありますが、それは「単純」とはほど遠いものであり、最後の手段となるでしょう。

読んでくれてありがとう。

4

2 に答える 2

2

Python 2は、最初に現在のパッケージに関連するモジュールを探します。ライブラリコードに多くのトップレベルモジュールのインポートがたくさんある場合、それらはすべて最初に相対的なものとして検索されます。したがって、パッケージfoo.barをインポートする場合os、Pythonは最初にを検索しfoo/bar/os.pyます。このミスはPython自体によってもキャッシュされます。

Python 3では、デフォルトは代わりに絶対インポートに移動しました。Python 2.5以降を切り替えて、モジュールごとの絶対インポートを使用することができます。

from __future__ import absolute_import

ファイルルックアップミスのもう1つの原因は、.pycバイトコードキャッシュファイルのロードです。それらが何らかの理由で欠落している場合(ファイルシステムは現在のPythonプロセスに対して書き込み可能ではありません)、Pythonは実行のたびにそれらを探し続けます。compileall次のモジュールを使用して、これらのキャッシュを作成できます。

python -m compileall /path/to/directory/with/pythoncode

正しい書き込み権限で実行した場合。

于 2013-03-18T10:23:44.463 に答える
2

impモジュールを使ってみませんか?特に関数があります:imp.find_module(module、path)ここhttp://docs.python.org/2.7/library/imp.html

少なくともこの例(以下を参照)は、open()syscallの数を単純な「importnumpy、scipy」と比較して減らします:(更新:しかし、この方法でsyscallを大幅に減らすことはできないようです...)

import imp
import sys


def loadm(name, path):
    fp, pathname, description = imp.find_module(name,[path])
    try:
        _module = imp.load_module(name, fp, pathname, description)
        return _module
    finally:
        # Since we may exit via an exception, close fp explicitly.
        if fp:
            fp.close()


numpy = loadm("numpy", "/home/username/py-virtual27/lib/python2.7/site-packages/")
scipy = loadm("scipy", "/home/username/py-virtual27/lib/python2.7/site-packages/")

また、PYTHONPATHが空または小さいことを確認することをお勧めします。これにより、読み込み時間が長くなる可能性もあります。

于 2013-03-18T17:28:11.987 に答える