web-dev-qa-db-ja.com

Pythonセグメンテーションエラーの原因は何ですか?

私はPythonでコサラジュのStrong Connected Component(SCC)グラフ検索アルゴリズムを実装しています。

このプログラムは小さなデータセットで良好に動作しますが、超大規模なグラフ(800,000以上のノード)で実行すると、「セグメンテーションフォールト」と表示されます。

その原因は何でしょうか?ありがとうございました!


追加情報:最初に、超大規模データセットで実行しているときにこのエラーが発生しました。

"RuntimeError: maximum recursion depth exceeded in cmp"

次に、次を使用して再帰制限をリセットします

sys.setrecursionlimit(50000)

しかし、「セグメンテーション違反」が発生しました

無限ループではなく、比較的小さなデータで正しく実行されると信じてください。プログラムがリソースを使い果たした可能性はありますか?

70
xiaolong

これは、pythonextension(Cで記述)が手の届かないところにメモリにアクセスしようとしたときに発生します。

次の方法でトレースできます。

  • コードの最初の行に sys.settrace を追加します。
  • this answer 。のMarkで説明されているようにgdbを使用します。コマンドプロンプトで

    gdb python
    (gdb) run /path/to/script.py
    ## wait for segfault ##
    (gdb) backtrace
    ## stack trace of the c code
    
65
Shiplu Mokaddim

あなたは問題を解決したと理解していますが、このスレッドを読んでいる他の人には、答えがあります:オペレーティングシステムがpythonプロセスに割り当てるスタックを増やす必要があります。

その方法は、オペレーティングシステムに依存します。 Linuxでは、ulimit -sコマンドで現在の値を確認し、ulimit -s <new_value>で値を増やすことができます。

前の値を2倍にしてみて、もし機能しない場合は、機能するかメモリーがなくなるまで続けます。

48
Davide

セグメンテーション違反は一般的なものであり、これには多くの理由が考えられます。

  • 低メモリ
  • 不良Ramメモリ
  • クエリを使用してdbから巨大なデータセットを取得する(取得したデータのサイズがスワップメモリ​​より大きい場合)
  • 間違ったクエリ/バグのあるコード
  • 長いループ(複数の再帰)を持っている
13
Sadheesh

コサラジュのSCC実装では、Python(Python segfault .. who who know!)とC++実装の両方でセグメンテーション違反を修正することにより、ulimitの更新が機能しました。

私のMACでは、次の方法で可能な最大値を見つけました。

$ ulimit -s -H
65532
2
Rock

RPIでdlibをアップグレードした後、このセグメンテーションエラーが発生していました。上記のShiplu Mokaddimが提案したようにスタックをトレースバックし、OpenBLASライブラリに落ち着きました。

OpenBLASもマルチスレッドであるため、マルチスレッドアプリケーションでOpenBLASを使用すると、セグメンテーションエラーが発生するまでスレッドが指数関数的に増加します。マルチスレッドアプリケーションの場合、OpenBlasをシングルスレッドモードに設定します。

python仮想環境で、OpenBLASに編集して単一のスレッドのみを使用するように指示します。

    $ workon <myenv>
    $ nano .virtualenv/<myenv>/bin/postactivate

追加します:

    export OPENBLAS_NUM_THREADS=1 
    export OPENBLAS_MAIN_FREE=1

再起動後、以前にクラッシュしていたrpi3bですべての画像認識アプリを実行できました。

参照: https://github.com/ageitgey/face_recognition/issues/294

0
Digitalf8

Google検索でこの記事が見つかりましたが、次の「個人的な解決策」が説明されていません。


Linux用WindowsサブシステムでのPython 3.7に対する最近の悩みは、同じPandasライブラリを持つ2台のマシンで、1つが私にsegmentation faultを与え、他のレポートが警告を出すことです。どちらが新しいかは明確ではありませんでしたが、pandasを「再インストール」することで問題が解決します。

バギーマシンで実行したコマンド。

conda install pandas

詳細:同一のスクリプト(Git経由で同期)を実行していましたが、両方ともWSL + Anacondaを搭載したWindows 10マシンです。ケースを作成するためにスクリーンショットをご覧ください。また、コマンドラインpythonSegmentation fault (core dumped)について文句を言うマシンでは、Jupyter labは毎回カーネルを再起動するだけです。さらに悪いことに、警告はまったく出されませんでした。

enter image description here

0
llinfeng