私はPythonでコサラジュのStrong Connected Component(SCC)グラフ検索アルゴリズムを実装しています。
このプログラムは小さなデータセットで良好に動作しますが、超大規模なグラフ(800,000以上のノード)で実行すると、「セグメンテーションフォールト」と表示されます。
その原因は何でしょうか?ありがとうございました!
追加情報:最初に、超大規模データセットで実行しているときにこのエラーが発生しました。
"RuntimeError: maximum recursion depth exceeded in cmp"
次に、次を使用して再帰制限をリセットします
sys.setrecursionlimit(50000)
しかし、「セグメンテーション違反」が発生しました
無限ループではなく、比較的小さなデータで正しく実行されると信じてください。プログラムがリソースを使い果たした可能性はありますか?
これは、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
あなたは問題を解決したと理解していますが、このスレッドを読んでいる他の人には、答えがあります:オペレーティングシステムがpythonプロセスに割り当てるスタックを増やす必要があります。
その方法は、オペレーティングシステムに依存します。 Linuxでは、ulimit -s
コマンドで現在の値を確認し、ulimit -s <new_value>
で値を増やすことができます。
前の値を2倍にしてみて、もし機能しない場合は、機能するかメモリーがなくなるまで続けます。
セグメンテーション違反は一般的なものであり、これには多くの理由が考えられます。
コサラジュのSCC実装では、Python(Python segfault .. who who know!)とC++実装の両方でセグメンテーション違反を修正することにより、ulimitの更新が機能しました。
私のMACでは、次の方法で可能な最大値を見つけました。
$ ulimit -s -H
65532
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ですべての画像認識アプリを実行できました。
Google検索でこの記事が見つかりましたが、次の「個人的な解決策」が説明されていません。
Linux用WindowsサブシステムでのPython 3.7に対する最近の悩みは、同じPandasライブラリを持つ2台のマシンで、1つが私にsegmentation fault
を与え、他のレポートが警告を出すことです。どちらが新しいかは明確ではありませんでしたが、pandas
を「再インストール」することで問題が解決します。
バギーマシンで実行したコマンド。
conda install pandas
詳細:同一のスクリプト(Git経由で同期)を実行していましたが、両方ともWSL + Anacondaを搭載したWindows 10マシンです。ケースを作成するためにスクリーンショットをご覧ください。また、コマンドラインpython
がSegmentation fault (core dumped)
について文句を言うマシンでは、Jupyter labは毎回カーネルを再起動するだけです。さらに悪いことに、警告はまったく出されませんでした。